Android 自定义dialog的实现代码
程序员文章站
2023-11-30 18:54:58
android 自定义dialog的实现代码
搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上...
android 自定义dialog的实现代码
搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上来。
要点:
1、设置自定义dialog的布局文件my_dialog.xml
2、设置一份自定义的样式文件styles_wx.xml,该文件用于覆盖android的默认主题样式,如黑色边框等。
3、java代码继承dialog实现自定义类mydialog,实现自定义布局,还有设置窗口的大小、位置等。
(网上文章要么少介绍第2点,要么是使用alterdialog直接实现效果)
先看下效果,模仿微信风格的dialog:
允许添加子view到弹出dialog,如:
代码。
part1.styles_wx.xml
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 微信弹窗 --> <style name="wx_dialog" parent="@android:style/theme.dialog"> <item name="android:windowframe">@null</item> <!-- 边框 --> <item name="android:windowisfloating">true</item> <!-- 是否浮现在activity之上 --> <item name="android:windowistranslucent">false</item> <!-- 半透明 --> <item name="android:windownotitle">true</item> <!-- 无标题 --> <item name="android:windowbackground">@drawable/transparent</item> <!-- 自己想要的背景 --> <item name="android:backgrounddimenabled">true</item> <!-- 背景内容模糊 --> </style> </resources>
注意,此处:
<item name="android:windowbackground">@drawable/transparent</item>
这是设置对话框弹出背景,尝试设置@null,仍然是黑色背景,在使用半透明图片时会受其影响。
所以,可以在这里指定你想要的背景图片或者颜色。
我为了灵活性,我设置该属性为名为"transparent"的图片,这是一张1*1的透明图片。这样背景完全透明,真正使用的背景在my_dialog.xml里定义
part2.my_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/frame_white" android:orientation="vertical" android:padding="15dp" > <textview android:id="@+id/tvtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/systitle" android:textsize="18sp" /> <!-- 分隔符用 --> <textview android:id="@+id/tvseparator" style="@style/textviewasseparator" android:layout_marginbottom="5dp" android:layout_margintop="5dp" /> <textview android:id="@+id/tvtext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/systext" android:textsize="18sp" /> <!-- 该relativelayout作为子视图容器 --> <relativelayout android:id="@+id/rlcontent" android:layout_width="match_parent" android:layout_height="wrap_content" > </relativelayout> <relativelayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margintop="10dp" android:orientation="horizontal" > <textview android:id="@+id/tvbutton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:layout_marginleft="10dp" android:background="@drawable/selector_text_button" android:clickable="true" android:paddingbottom="5dp" android:paddingleft="15dp" android:paddingright="15dp" android:paddingtop="5dp" android:text="@string/ok" android:textcolor="@color/wx_text_link" android:textsize="14sp" android:visibility="visible" /> <textview android:id="@+id/tvbutton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignwithparentifmissing="true" android:layout_marginleft="10dp" android:layout_toleftof="@id/tvbutton2" android:background="@drawable/selector_text_button" android:clickable="true" android:paddingbottom="5dp" android:paddingleft="15dp" android:paddingright="15dp" android:paddingtop="5dp" android:text="@string/cancel" android:textcolor="@color/wx_text_link" android:textsize="14sp" /> </relativelayout> </linearlayout>
part3.mydialog.java
package com.kwws; import android.app.dialog; import android.content.context; import android.os.bundle; import android.util.displaymetrics; import android.view.layoutinflater; import android.view.view; import android.view.window; import android.view.windowmanager; import android.widget.relativelayout; import android.widget.textview; import com.navigator.r; /** * 自定义对话框 * * @author kangwei * */ public class mydialog extends dialog { /* 属性 */ // 数据 string title = "title"; string text = "text"; string cancelbuttontext = "cancel"; string okbuttontext = "ok"; int okcolor = -1; int cancelcolor = -1; // ui context mcontent; textview tvtitle; textview tvseparator; textview tvtext; textview tvbtn1; textview tvbtn2; relativelayout childviewwrapper;// 子组件容器 /** * 设置对话框样式,设置null则不显示 * * @param context * 上下文 * @param title * 标题 * @param text * 文本 * @param cancelbuttontext * 取消按钮文本 * @param okbuttontext * 确认按钮文本 */ public mydialog(context context, string title, string text, string cancelbuttontext, string okbuttontext) { super(context, r.style.wx_dialog);// 样式定义,该样式去除android默认的黑色背景边框等。 this.mcontent = context; setdialogstyle(title, text, cancelbuttontext, okbuttontext); } @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); layoutinflater layout = layoutinflater.from(mcontent); view view = layout.inflate(r.layout.my_dialog, null); setcontentview(view); findview(); initview(); initviewevent(); } private void setdialogstyle(string title, string text, string cancelbuttontext, string okbuttontext) { this.title = title; this.text = text; this.cancelbuttontext = cancelbuttontext; this.okbuttontext = okbuttontext; } private void findview() { tvtitle = (textview) findviewbyid(r.id.tvtitle); tvseparator = (textview) findviewbyid(r.id.tvseparator); tvtext = (textview) findviewbyid(r.id.tvtext); tvbtn1 = (textview) findviewbyid(r.id.tvbutton1); tvbtn2 = (textview) findviewbyid(r.id.tvbutton2); childviewwrapper = (relativelayout) findviewbyid(r.id.rlcontent); } private void initview() { if (title == null) { tvtitle.setvisibility(view.gone); tvseparator.setvisibility(view.gone); } else { tvtitle.setvisibility(view.visible); tvseparator.setvisibility(view.visible); tvtitle.settext(title); } if (text == null) { tvtext.setvisibility(view.gone); } else { tvtext.setvisibility(view.visible); tvtext.settext(text); } if (cancelbuttontext == null) { tvbtn1.setvisibility(view.gone); } else { tvbtn1.setvisibility(view.visible); tvbtn1.settext(cancelbuttontext); if (cancelcolor != -1) { tvbtn1.settextcolor(cancelcolor); } } if (okbuttontext == null) { tvbtn2.setvisibility(view.gone); } else { tvbtn2.setvisibility(view.visible); tvbtn2.settext(okbuttontext); if (okcolor != -1) { tvbtn2.settextcolor(okcolor); } } if (childviewwrapper != null && childview != null) { childviewwrapper.addview(childview); } // 设置对话框大小 window dialogwindow = getwindow(); windowmanager.layoutparams lp = dialogwindow.getattributes(); displaymetrics d = mcontent.getresources().getdisplaymetrics(); // 获取屏幕宽、高用 lp.width = (int) (d.widthpixels * 0.8); // 高度设置为屏幕的0.8 dialogwindow.setattributes(lp); } private void initviewevent() { view.onclicklistener listener = new view.onclicklistener() { @override public void onclick(view v) { // todo auto-generated method stub switch (v.getid()) { case r.id.tvbutton1: if (mlistener != null) { mlistener.oncancelbuttonclick(mydialog.this, v); } break; case r.id.tvbutton2: if (mlistener != null) { mlistener.onokbuttonclick(mydialog.this, v); } break; default: break; } } }; tvbtn1.setonclicklistener(listener); tvbtn2.setonclicklistener(listener); } public interface ondialogbuttonclicklistener { void oncancelbuttonclick(mydialog dialog, view view); void onokbuttonclick(mydialog dialog, view view); } private ondialogbuttonclicklistener mlistener; /** * 对话框按钮监听 * * @param listener */ public void setondialogbuttonclicklistener( ondialogbuttonclicklistener listener) { this.mlistener = listener; } /** * 确定按钮文本颜色 * * @param color */ public void setokbuttontextcolor(int color) { this.okcolor = color; } /** * 取消按钮文本颜色 * * @param color */ public void setcancelbuttontextcolor(int color) { this.cancelcolor = color; } view childview; /** * 在对话框显示自定义视图 */ public void setchildview(view view) { childview = view; } }
part4.使用
// 退出提示框 public void exitdialog() { mydialog dialog = new mydialog(this, "提示", "确认退出?", "取消", "退出"); dialog.setokbuttontextcolor(getresources().getcolor(r.color.red)); dialog.setondialogbuttonclicklistener(new ondialogbuttonclicklistener() { @override public void onokbuttonclick(mydialog dialog, view view) { finish(); } @override public void oncancelbuttonclick(mydialog dialog, view view) { dialog.dismiss(); } }); dialog.show(); }
/* * 显示配置对话框 */ private void showconfigdialog() { // 读取参数 final sharedpreferenceshelper helper = new sharedpreferenceshelper( this, "config"); final string ip = helper.getvalue("serverip"); final string port = helper.getvalue("serverport"); // 配置界面 输入ip和端口的简单界面,这里就不附xml了 view view = getlayoutinflater().inflate(r.layout.dialog_config, null); final edittext etip = (edittext) view.findviewbyid(r.id.etip); final edittext etport = (edittext) view.findviewbyid(r.id.etport); etip.settext(ip != null ? ip : ksoap2helper.getserverip()); etport.settext(port != null ? port : string.valueof(ksoap2helper .getserverport())); // 配置对话框 mydialog dialog = new mydialog(this, "参数配置", null, "取消", "确定"); // 添加配置界面到对话框 dialog.setchildview(view); // 按钮监听 dialog.setondialogbuttonclicklistener(new ondialogbuttonclicklistener() { @override public void onokbuttonclick(mydialog dialog, view view) { // 保存配置 string newip = etip.gettext().tostring(); string newport = etport.gettext().tostring(); if (true) { helper.putvalue("serverip", newip); ksoap2helper.setserverip(newip); } if (true) { helper.putvalue("serverport", newport); ksoap2helper.setserverport(integer.valueof(newport)); } dialog.dismiss(); } @override public void oncancelbuttonclick(mydialog dialog, view view) { dialog.dismiss(); } }); dialog.show(); }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读