Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)
虽然android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的apk都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的主题不着边际并且看起来也不顺心,那我们就需要自定义了,为了方便大家对自定义组件的学习,我接下来准备了几遍有关自定义的dialog的文章,希望对大家有帮助。
在开发apk中最常见的估计就数弹出对话框了,这种对话框按照按钮数量来分大致是三种:一个按钮,两个按钮,三个按钮。现在要讲的就是按照按钮数量分为以上三类吧(当然了可以有更多的按钮,只要你愿意)。
自定义dialog对话大致可分为三步走吧:第一步就是重新定义dialog的样式,第二部就是定义我们需要显示的布局文件,第三部就是设置事件监听器。
好了,还是老规矩,首先贴上工程目录:
在工程中我定义了一个基类basebean,这个类用来作为在整个工程项目中的基类,基类中定义一些公共的常用的属性,如有需要另外属性我们只需要继承基类就好了,所以我定义了dialogbean,它继承了basebean,因此拥有了basebean的所有功能。那我们先看看basebean中定义的都是啥吧:
public class basebean { /** * 标题 */ string title; /** * 内容 */ string content; /** * 获取标题 * * @return 标题 */ public string gettitle() { return title; } /** * 设置标题 * * @param title * 标题 */ public void settitle(string title) { this.title = title; } /** * 获取内容 * * @return 内容 */ public string getcontent() { return content; } /** * 设置内容 * * @param content * 内容 */ public void setcontent(string content) { this.content = content; } }
以上是基类中的内容,那接下来就看看dialog中是怎么定义的吧:
public class dialogbean extends basebean { /** * 点击返回键是否可消失 */ boolean cancelable; /** * 点击蒙皮是否可以消失 */ boolean outcancelable; /** * 事件监听 */ dialogclicklistener listener; /** * 按钮类型【默认显示两个按钮】 */ dialogbuttontype buttontype = dialogbuttontype.twobutton; /** * 显示布局资源id */ integer layoutresid; public dialogbean() { } /** * 点击back键是否可以消失 * * @return 【true:可消失】【false:不消失】 */ public boolean iscancelable() { return cancelable; } /** * 设置点击back键是否可以消失 * * @param cancelable * 【true:可消失】【false:不消失】 */ public void setcancelable(boolean cancelable) { this.cancelable = cancelable; } /** * 点击蒙皮是否可以消失 * * @return 【true:可消失】【false:不消失】 */ public boolean isoutcancelable() { return outcancelable; } /** * 设置点击蒙皮是否可以消失 * * @param outcancelable * 【true:可消失】【false:不消失】 */ public void setoutcancelable(boolean outcancelable) { this.outcancelable = outcancelable; } /** * 获取事件监听器 * * @return 事件监听器 */ public dialogclicklistener getlistener() { return listener; } /** * 设置事件监听器 * * @param listener * 事件监听器 */ public void setlistener(dialogclicklistener listener) { this.listener = listener; } /** * 获取按钮类型 * * @return 按钮类型 */ public dialogbuttontype getbuttontype() { return buttontype; } /** * 设置按钮类型 * * @param buttontype * 按钮类型 */ public void setbuttontype(dialogbuttontype buttontype) { this.buttontype = buttontype; } /** * 获取要显示的布局id * * @return 要显示的布局id */ public integer getlayoutresid() { return layoutresid; } /** * 设置要显示的布局id * * @param layoutresid * 要显示的布局id */ public void setlayoutresid(integer layoutresid) { this.layoutresid = layoutresid; } /** * 按钮类型 * * @author llew */ public enum dialogbuttontype { /** * 一个按钮 */ onebutton, /** * 两个按钮 */ twobutton, /** * 三个按钮 */ threebutton } /** * 按钮点击监听器 * * @author llew * */ public interface dialogclicklistener { /** * 点击按钮 * * @param buttonindex * 按钮下标【从0开始】 */ public void onclick(int buttonindex); } }
dialogbean中的代码注释的都很详细了,就不再多解释了,主要就是封装了对话框中常见的属性。接下来就看看定义的所需要的dialog的样式吧:
<style name="theme_dialog_alert" parent="@android:style/theme.dialog"> <item name="android:windownotitle">true</item> <item name="android:windowbackground">@android:color/transparent</item> </style>
样式主要定义了该对话框没有标题,背景颜色是透明的,现在所需的样式定义完了,主角globledialog该出场了,代码如下:
public class globledialog extends dialog implements view.onclicklistener { private textview titletextview, contenttextview; private button leftbutton, centerbutton ,rightbutton; private dialogbean bean; public globledialog(context context, int theme, dialogbean bean) { super(context, theme); this.bean = bean; initwedgits(); } /** * 初始化各组件 */ private void initwedgits() { try { setcancelable(bean.iscancelable()); setcanceledontouchoutside(bean.isoutcancelable()); view dialogview = getlayoutinflater().inflate(bean.getlayoutresid(), null); titletextview = (textview) dialogview.findviewbyid(r.id.button_title); contenttextview = (textview) dialogview.findviewbyid(r.id.button_content); titletextview.settext(bean.gettitle()); contenttextview.settext(bean.getcontent()); leftbutton = (button) dialogview.findviewbyid(r.id.button_left); centerbutton = (button) dialogview.findviewbyid(r.id.button_center); rightbutton = (button) dialogview.findviewbyid(r.id.button_right); leftbutton.setonclicklistener(this); centerbutton.setonclicklistener(this); rightbutton.setonclicklistener(this); if(dialogbuttontype.onebutton == bean.getbuttontype()) { leftbutton.setvisibility(view.gone); rightbutton.setvisibility(view.gone); } else if(dialogbuttontype.twobutton == bean.getbuttontype()) { centerbutton.setvisibility(view.gone); } setcontentview(dialogview); window dialogwindow = getwindow(); windowmanager.layoutparams lp = dialogwindow.getattributes(); dialogwindow.setgravity(gravity.center); displaymetrics dm = new displaymetrics(); dialogwindow.getwindowmanager().getdefaultdisplay().getmetrics(dm); lp.width = dm.widthpixels - 20; dialogwindow.setattributes(lp); } catch (exception e) { e.printstacktrace(); } } @override public void onclick(view v) { try { switch (v.getid()) { case r.id.button_left: bean.getlistener().onclick(0); break; case r.id.button_center: bean.getlistener().onclick(1); break; case r.id.button_right: bean.getlistener().onclick(2); break; default: break; } } catch (exception e) { e.printstacktrace(); } } }
自定义的globledialog的代码写完了,那就看看是如何使用的吧:
package com.llew.e.dialog.view.activity; import android.app.activity; import android.app.dialog; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.textview; import android.widget.toast; import com.llew.e.dialog.r; import com.llew.e.dialog.view.bean.dialogbean; import com.llew.e.dialog.view.bean.dialogbean.dialogbuttontype; import com.llew.e.dialog.view.bean.dialogbean.dialogclicklistener; import com.llew.e.dialog.view.wedgit.globledialog; public class mainactivity extends activity { /** called when the activity is first created. */ private dialog dialog; private textview textview; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); textview = (textview) findviewbyid(r.id.textview); textview.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { dialogbean dialogbean = new dialogbean(); dialogbean.setcancelable(true); dialogbean.setoutcancelable(true); dialogbean.settitle("小练习"); dialogbean.setcontent("在这里输入提示信息"); dialogbean.setbuttontype(dialogbuttontype.twobutton); dialogbean.setlayoutresid(r.layout.dialog_common); dialogbean.setlistener(new dialogclicklistener() { @override public void onclick(int buttonindex) { switch (buttonindex) { case 0: toast.maketext(mainactivity.this, "点击了播放", toast.length_short).show(); break; case 1: toast.maketext(mainactivity.this, "点击了暂停", toast.length_short).show(); break; case 2: toast.maketext(mainactivity.this, "点击了停止", toast.length_short).show(); break; default: break; } } }); createdialog(dialogbean); } }); } public void createdialog(dialogbean bean) { if(null == dialog) { dialog = new globledialog(mainactivity.this, r.style.theme_dialog_alert, bean); } dialog.show(); } }
代码实在是没有什么好解释的,我相信你一看就会,那看看运行效果吧:
界面看上去有点丑,大家可以自己修改颜色值或者使用图片代替。
好了,到这里自定义dialog实现不同风格效果的对话框就讲解完了,谢谢大家的阅读。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。