Android 自定义dialog的实现代码

Android 自定义dialog的实现代码,第1张

概述Android自定义dialog的实现代码搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上来。

AndroID 自定义dialog的实现代码

搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上来。

要点:

1、设置自定义dialog的布局文件my_dialog.xml
2、设置一份自定义的样式文件styles_wx.xml,该文件用于覆盖AndroID的默认主题样式,如黑色边框等。
3、Java代码继承Dialog实现自定义类MyDialog,实现自定义布局,还有设置窗口的大小、位置等。

(网上文章要么少介绍第2点,要么是使用AlterDialog直接实现效果)

先看下效果,模仿微信风格的dialog:

允许添加子vIEw到d出dialog,如:

代码。

Part1.styles_wx.xml

<?xml version="1.0" enCoding="utf-8"?> <resources xmlns:androID="http://schemas.androID.com/apk/res/androID">    <!-- 微信d窗 -->   <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> 

这是设置对话框d出背景,尝试设置@null,仍然是黑色背景,在使用半透明图片时会受其影响。

所以,可以在这里指定你想要的背景图片或者颜色。

我为了灵活性,我设置该属性为名为"transparent"的图片,这是一张1*1的透明图片。这样背景完全透明,真正使用的背景在my_dialog.xml里定义

Part2.my_dialog.xml

@H_301_59@<?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" 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

@H_301_59@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 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.使用

@H_301_59@// 退出提示框 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(); } @H_301_59@/* * 显示配置对话框 */ 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(); }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

以上是内存溢出为你收集整理的Android 自定义dialog的实现代码全部内容,希望文章能够帮你解决Android 自定义dialog的实现代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存