当前位置: 移动技术网 > 移动技术>移动开发>Android > Android自定义对话框Dialog的简单实现

Android自定义对话框Dialog的简单实现

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文着重研究了自定义对话框,通过一下步骤即可清晰的理解原理,通过更改界面设置和style类型,可以应用在各种各样适合自己的app中。

首先来看一下效果图:

首先是activity的界面

点击了上述图片的按钮后,弹出对话框:

点击对话框的确定按钮:

点击对话框的取消按钮:

下面来说一下具体实现步骤:

第一步:设置dialog的样式(一般项目都可以直接拿来用):style.xml中

<!--自定义dialog背景全透明无边框theme-->
 <style name="mydialog" parent="android:style/theme.dialog">
  <!--背景颜色和透明程度-->
  <item name="android:windowbackground">@android:color/transparent</item>
  <!--是否去除标题-->
  <item name="android:windownotitle">true</item>
  <!--是否去除边框-->
  <item name="android:windowframe">@null</item>
  <!--是否浮现在activity之上-->
  <item name="android:windowisfloating">true</item>
  <!--是否模糊-->
  <item name="android:backgrounddimenabled">false</item>
 </style>

第二步:自定义dialog:

(1)自定义的dialog的布局:dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#11ffffff">
<linearlayout
 android:layout_width="260dp"
 android:layout_height="wrap_content"
 android:layout_centerinparent="true"
 android:background="@drawable/free_dialog_bg"
 android:orientation="vertical">
<textview
 android:id="@+id/title"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:text="警告!!!"
 android:textcolor="#38adff"
 android:textsize="16sp"/>
 <textview
  android:id="@+id/message"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginleft="20dp"
  android:layout_marginright="20dp"
  android:layout_gravity="center"
  android:text="您的手机马上自爆"/>
 <view
  android:layout_width="match_parent"
  android:layout_height="1px"
  android:layout_margintop="15dp"
  android:background="#e4e4e4"/>
 <linearlayout
  android:layout_width="match_parent"
  android:layout_height="40dp"
  android:orientation="horizontal">
  <button
   android:id="@+id/no"
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:layout_marginleft="10dp"
   android:background="@null"
   android:gravity="center"
   android:lines="1"
   android:text="取消"
   android:textcolor="#7d7d7d"
   android:textsize="16sp"/>
  <view
   android:layout_width="1px"
   android:layout_height="match_parent"
   android:background="#e4e4e4"/>
  <button
   android:id="@+id/yes"
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:layout_marginright="10dp"
   android:background="@null"
   android:gravity="center"
   android:lines="1"
   android:text="确定"
   android:textcolor="#38adff"
   android:textsize="16sp"/>
 </linearlayout>
</linearlayout>
</relativelayout>

(2)自定义dialog布局中的背景:free_dialog_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <solid android:color="#ffffff" />
 <stroke
  android:width="0.8dp"
  android:color="#ffffff" />
 <!-- 圆角 -->
 <corners android:radius="6dp" />
</shape>

(3) 自定义的dialog的java:mydialog.class

package com.syah.mydialog;

import android.app.dialog;
import android.content.context;
import android.os.bundle;
import android.support.annotation.nonnull;
import android.support.annotation.styleres;
import android.view.view;
import android.widget.button;
import android.widget.textview;

/**
 * 创建自定义的dialog,主要学习实现原理
 * created by admin on 2017/8/30.
 */

public class mydialog extends dialog {
 private button yes;//确定按钮
 private button no;//取消按钮
 private textview titletv;//消息标题文本
 private textview message;//消息提示文本
 private string titlestr;//从外界设置的title文本
 private string messagestr;//从外界设置的消息文本
 //确定文本和取消文本的显示的内容
 private string yesstr, nostr;
 private onnoonclicklistener noonclicklistener;//取消按钮被点击了的监听器
 private onyesonclicklistener yesonclicklistener;//确定按钮被点击了的监听器

 public mydialog(@nonnull context context, @styleres int themeresid) {
  super(context, themeresid);
 }

 /**
  * 设置取消按钮的显示内容和监听
  *
  * @param str
  * @param onnoonclicklistener
  */
 public void setnoonclicklistener(string str, onnoonclicklistener onnoonclicklistener) {
  if (str != null) {
   nostr = str;
  }
  this.noonclicklistener = onnoonclicklistener;
 }

 /**
  * 设置确定按钮的显示内容和监听
  *
  * @param str
  * @param yesonclicklistener
  */
 public void setyesonclicklistener(string str, onyesonclicklistener yesonclicklistener) {
  if (str != null) {
   yesstr = str;
  }
  this.yesonclicklistener = yesonclicklistener;
 }



 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.dialog);
  //空白处不能取消动画
  setcanceledontouchoutside(false);

  //初始化界面控件
  initview();

  //初始化界面数据
  initdata();
  //初始化界面控件的事件
  initevent();
 }

 /**
  * 初始化界面控件
  */
 private void initview() {
  yes = findviewbyid(r.id.yes);
  no = findviewbyid(r.id.no);
  titletv = (textview) findviewbyid(r.id.title);
  message = (textview) findviewbyid(r.id.message);
 }

 /**
  * 初始化界面控件的显示数据
  */
 private void initdata() {
  //如果用户自定了title和message
  if (titlestr != null) {
   titletv.settext(titlestr);
  }
  if (messagestr != null) {
   message.settext(messagestr);
  }
  //如果设置按钮文字
  if (yesstr != null) {
   yes.settext(yesstr);
  }
  if (nostr != null) {
   no.settext(nostr);
  }
 }

 /**
  * 初始化界面的确定和取消监听
  */
 private void initevent() {
  //设置确定按钮被点击后,向外界提供监听
  yes.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (yesonclicklistener != null) {
     yesonclicklistener.onyesonclick();
    }
   }
  });
  //设置取消按钮被点击后,向外界提供监听
  no.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (noonclicklistener != null) {
     noonclicklistener.onnoclick();
    }
   }
  });
 }

 /**
  * 从外界activity为dialog设置标题
  *
  * @param title
  */
 public void settitle(string title) {
  titlestr = title;
 }

 /**
  * 从外界activity为dialog设置message
  *
  * @param message
  */
 public void setmessage(string message) {
  messagestr = message;
 }

 public interface onnoonclicklistener {
  public void onnoclick();
 }

 public interface onyesonclicklistener {
  public void onyesonclick();
 }
}

第三步:activity中使用自定义对话框:

(1)activity的布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.syah.mydialog.mainactivity">

 <button
  android:id="@+id/btn"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="自定义dialog"
  app:layout_constraintbottom_tobottomof="parent"
  app:layout_constraintleft_toleftof="parent"
  app:layout_constraintright_torightof="parent"
  app:layout_constrainttop_totopof="parent" />

</android.support.constraint.constraintlayout>

(2) mainactivity.class

package com.syah.mydialog;

import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.view.view;
import android.view.window;
import android.widget.button;
import android.widget.toast;

public class mainactivity extends appcompatactivity {
 private mydialog mydialog;
 private button button;

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  requestwindowfeature(window.feature_no_title);
  setcontentview(r.layout.activity_main);
  button = (button) findviewbyid(r.id.btn);
  button.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view view) {
    mydialog=new mydialog(mainactivity.this,r.style.mydialog);
    mydialog.settitle("警告!");
    mydialog.setmessage("警告:您的手机3秒钟内自爆");
    mydialog.setyesonclicklistener("确定", new mydialog.onyesonclicklistener() {
     @override
     public void onyesonclick() {
      toast.maketext(getapplicationcontext(),"拜拜,我们来生见",toast.length_long).show();
      mydialog.dismiss();
     }
    });
    mydialog.setnoonclicklistener("取消", new mydialog.onnoonclicklistener() {
     @override
     public void onnoclick() {
      toast.maketext(getapplicationcontext(),"明智的选择",toast.length_long).show();
      mydialog.dismiss();
     }
    });
    mydialog.show();
   }
  });
 }
}

原理:

1、通过构造方法给dialog设置一个主题 r.style.mydialog , 主要设置dialog的显示属性,一般都是 全透明无边框

2、然后在dialog的oncreate()方法中,用setcontentview( r.layout.selfdialog) 为dialog设置xml文件,我们就可以在layout文件中创建自定义的dialog风格。这里我就自定义了xml文件格式,实现了自定义的外观风格,不受系统的主题影响。

3、然后通过设置要为外界设置一些public 公开的方法,来向自定义的dialog传递值。这里的title 和 message,都是可以通过外界传值进来,进行设置的。如下面的public 方法就是供外界activity来设置title和message的:

/**
  * 从外界activity为dialog设置标题
  *
  * @param title
  */
 public void settitle(string title) {
  titlestr = title;
 }

 /**
  * 从外界activity为dialog设置message
  *
  * @param message
  */
 public void setmessage(string message) {
  messagestr = message;
 }

在activity通过实例化dialog后就可以设置titile和message了。

mydialog=new mydialog(mainactivity.this);
mydialog.settitle("警告!");
mydialog.setmessage("警告:您的手机3秒钟内自爆");

另外在mydialog.class中通过下面构造器可以更灵活的选择dialog的类型

public mydialog(@nonnull context context, @styleres int themeresid) {
  super(context, themeresid);
  }

activity中使用自定义的dialog:

mydialog=new mydialog(mainactivity.this,r.style.mydialog);

4、最后,自定义的dialog中包含了一些按钮的时候,这个时候要想让按钮有点击事件,并且把这个点击事件能够传递给activity,让acitvity做一些事情,这里就需要设置监听接口,让button的点击事件能够让外界activity知道。如下面的代码。

/**
  * 确定按钮接口
  */
 public interface onnoonclicklistener {
  public void onnoclick();
 }

 /**
  * 取消按钮接口
  */
 public interface onyesonclicklistener {
  public void onyesonclick();
 }
private onnoonclicklistener noonclicklistener;//取消按钮被点击了的监听器
 private onyesonclicklistener yesonclicklistener;//确定按钮被点击了的监听器

 /**
  * 设置取消按钮的显示内容和监听
  *
  * @param str
  * @param onnoonclicklistener
  */
 public void setnoonclicklistener(string str, onnoonclicklistener onnoonclicklistener) {
  if (str != null) {
   nostr = str;
  }
  this.noonclicklistener = onnoonclicklistener;
 }

 /**
  * 设置确定按钮的显示内容和监听
  *
  * @param str
  * @param yesonclicklistener
  */
 public void setyesonclicklistener(string str, onyesonclicklistener yesonclicklistener) {
  if (str != null) {
   yesstr = str;
  }
  this.yesonclicklistener = yesonclicklistener;
 }
//设置确定按钮被点击后,向外界提供监听
  yes.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (yesonclicklistener != null) {
     yesonclicklistener.onyesonclick();
    }
   }
  });
  //设置取消按钮被点击后,向外界提供监听
  no.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (noonclicklistener != null) {
     noonclicklistener.onnoclick();
    }
   }
  });

activity就可以设置监听接口来实时获取button的点击事件如下:

mydialog.setyesonclicklistener("确定", new mydialog.onyesonclicklistener() {
     @override
     public void onyesonclick() {
      toast.maketext(getapplicationcontext(),"拜拜,我们来生见",toast.length_long).show();
      mydialog.dismiss();
     }
    });
    mydialog.setnoonclicklistener("取消", new mydialog.onnoonclicklistener() {
     @override
     public void onnoclick() {
      toast.maketext(getapplicationcontext(),"明智的选择",toast.length_long).show();
      mydialog.dismiss();
     }
    });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网