Android自定义对话框Dialog的简单实现
本文着重研究了自定义对话框,通过一下步骤即可清晰的理解原理,通过更改界面设置和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(); } });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。