Android培训教程-自定义对话框Dialog的几种方式
更新时间:2024-05-16 14:07:01 阅读量: 综合文库 文档下载
- 单簧管培训教程推荐度:
- 相关推荐
http://www.moliying.com
接下来我就以一个简单风格的自定义Dialog来讲讲自定义dialog的一般步骤和原理
第一步: 给Dialog设置一个风格主题(基本都是用这个主题)无边框全透明背景
第二步:给自定的Dialog设置自定义的 xml界面,我这里只是示范,你可以使用单选,多选,3个按钮,4个按钮等等,格式各样的自定义XML,我这里就定义了 标题title,信息message,还有一个确定按钮和取消按钮,如下:
磨砺营IT教育版权所有 http://www.moliying.com android:layout_width=\ android:layout_height=\ android:background=\ android:layout_width=\ android:layout_height=\ android:layout_centerInParent=\ android:background=\ android:orientation=\ android:id=\ android:layout_width=\ android:layout_height=\ android:layout_gravity=\ android:layout_margin=\ android:gravity=\ android:text=\消息提示\ android:textColor=\ android:textSize=\ 磨砺营IT教育版权所有 http://www.moliying.com android:id=\ android:layout_width=\ android:layout_height=\ android:layout_marginLeft=\ android:layout_marginRight=\ android:text=\提示消息\ android:layout_width=\ android:layout_height=\ android:layout_marginTop=\ android:background=\ android:layout_width=\ android:layout_height=\ android:orientation=\
Dialog的自定义背景框如下:
android:width=\ android:color=\ 磨砺营IT教育版权所有 http://www.moliying.com
最后的样子如下,红框中的部分:
第三步:继承Dialog实现自定义的Dialog,先上代码,供大家欣赏下:
1 package com.world.hello.selfdialog;
磨砺营IT教育版权所有
http://www.moliying.com
2
3 import android.app.Dialog; 4 import android.content.Context; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 import android.widget.TextView; 9 10 /**
11 * 创建自定义的dialog,主要学习其实现原理 12 * Created by chengguo on 2016/3/22. 13 */
14 public class SelfDialog extends Dialog { 15
16 private Button yes;//确定按钮 17 private Button no;//取消按钮
18 private TextView titleTv;//消息标题文本 19 private TextView messageTv;//消息提示文本 20 private String titleStr;//从外界设置的title文本 21 private String messageStr;//从外界设置的消息文本 22 //确定文本和取消文本的显示内容 23 private String yesStr, noStr; 24
25 private onNoOnclickListener noOnclickListener;//取消按钮被点击了的监听器 26 private onYesOnclickListener yesOnclickListener;//确定按钮被点击了的监听27 器 28 29 /**
30 * 设置取消按钮的显示内容和监听 31 *
32 * @param str
33 * @param onNoOnclickListener
磨砺营IT教育版权所有
http://www.moliying.com
34 */
35 public void setNoOnclickListener(String str, onNoOnclickListener 36 onNoOnclickListener) { 37 if (str != null) { 38 noStr = str; 39 }
40 this.noOnclickListener = onNoOnclickListener; 41 } 42 43 /**
44 * 设置确定按钮的显示内容和监听 45 *
46 * @param str
47 * @param onYesOnclickListener 48 */
49 public void setYesOnclickListener(String str, onYesOnclickListener 50 onYesOnclickListener) { 51 if (str != null) { 52 yesStr = str; 53 }
54 this.yesOnclickListener = onYesOnclickListener; 55 } 56
57 public SelfDialog(Context context) { 58 super(context, R.style.MyDialog); 59 } 60
61 @Override
62 protected void onCreate(Bundle savedInstanceState) { 63 super.onCreate(savedInstanceState);
64 setContentView(R.layout.free_exercise_sure_dialog_layout); 65 //按空白处不能取消动画
磨砺营IT教育版权所有
http://www.moliying.com
66 setCanceledOnTouchOutside(false); 67
68 //初始化界面控件 69 initView(); 70 //初始化界面数据 71 initData();
72 //初始化界面控件的事件 73 initEvent(); 74 75 } 76 77 /**
78 * 初始化界面的确定和取消监听器 79 */
80 private void initEvent() {
81 //设置确定按钮被点击后,向外界提供监听
82 yes.setOnClickListener(new View.OnClickListener() { 83 @Override
84 public void onClick(View v) { 85 if (yesOnclickListener != null) { 86 yesOnclickListener.onYesClick(); 87 } 88 } 89 });
90 //设置取消按钮被点击后,向外界提供监听
91 no.setOnClickListener(new View.OnClickListener() { 92 @Override
93 public void onClick(View v) { 94 if (noOnclickListener != null) { 95 noOnclickListener.onNoClick(); 96 } 97 }
磨砺营IT教育版权所有
http://www.moliying.com
98 }); 99 } 100 101 /**
102 * 初始化界面控件的显示数据 103 */
104 private void initData() {
105 //如果用户自定了title和message 106 if (titleStr != null) { 107 titleTv.setText(titleStr); 108 }
109 if (messageStr != null) {
110 messageTv.setText(messageStr); 111 }
112 //如果设置按钮的文字 113 if (yesStr != null) { 114 yes.setText(yesStr); 115 }
116 if (noStr != null) { 117 no.setText(noStr); 118 } 119 } 120 121 /**
122 * 初始化界面控件 123 */
124 private void initView() {
125 yes = (Button) findViewById(R.id.yes); 126 no = (Button) findViewById(R.id.no);
127 titleTv = (TextView) findViewById(R.id.title); 128 messageTv = (TextView) findViewById(R.id.message); 129 }
磨砺营IT教育版权所有
http://www.moliying.com
130 131 /**
132 * 从外界Activity为Dialog设置标题 133 *
134 * @param title 135 */
136 public void setTitle(String title) { 137 titleStr = title; 138 } 139 140 /**
141 * 从外界Activity为Dialog设置dialog的message 142 *
143 * @param message 144 */
145 public void setMessage(String message) { 146 messageStr = message; 147 } 148 149 /**
150 * 设置确定按钮和取消被点击的接口 151 */
152 public interface onYesOnclickListener { 153 public void onYesClick(); 154 } 155
156 public interface onNoOnclickListener { public void onNoClick(); } }
主actvitiy的代码如下:
磨砺营IT教育版权所有
http://www.moliying.com
1 package com.world.hello.selfdialog; 2
3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Toast; 7
8 public class MainActivity extends AppCompatActivity { 9
10 private SelfDialog selfDialog; 11
12 @Override
13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16
17 findViewById(R.id.self_dialog).setOnClickListener(new 18 View.OnClickListener() { 19 @Override
20 public void onClick(View v) { 21
22 selfDialog = new SelfDialog(MainActivity.this); 23 selfDialog.setTitle(\提示\);
24 selfDialog.setMessage(\确定退出应用?\); 25 selfDialog.setYesOnclickListener(\确定\, new 26 SelfDialog.onYesOnclickListener() { 27 @Override
28 public void onYesClick() {
29 Toast.makeText(MainActivity.this,\点击了--确定--按钮30 \,Toast.LENGTH_LONG).show();
31 selfDialog.dismiss(); 32 }
磨砺营IT教育版权所有
http://www.moliying.com
33 });
34 selfDialog.setNoOnclickListener(\取消\, new 35 SelfDialog.onNoOnclickListener() { 36 @Override
37 public void onNoClick() {
38 Toast.makeText(MainActivity.this,\点击了--取消--按钮39 \,Toast.LENGTH_LONG).show();
40 selfDialog.dismiss(); 41 } 42 });
selfDialog.show(); } }); } }
下面是gif示例图:
磨砺营IT教育版权所有
http://www.moliying.com
好了,看了上面的例子,大家是不是觉得,以后都可以自定义自己的dialog了呢,这里在给大家讲讲具体原理:
就拿本例来说,我定义了一个title,一个message,一个确定按钮,一个取消按钮。
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的
1 /**
2 * 从外界Activity为Dialog设置标题 3 *
4 * @param title 5 */
6 public void setTitle(String title) { 7 titleStr = title; 8 } 9 10 /**
11 * 从外界Activity为Dialog设置dialog的message 12 *
13 * @param message 14 */
15 public void setMessage(String message) { 16 messageStr = message; 17 }
在activity通过实例化Dialog后就可以设置titile和message了。
磨砺营IT教育版权所有
http://www.moliying.com
1 selfDialog = new SelfDialog(MainActivity.this); 2 selfDialog.setTitle(\提示\);
3 selfDialog.setMessage(\确定退出应用?\);
4、最后,自定义的dialog中包含了一些按钮的时候,这个时候要想让按钮有点击事件,并且把这个点击事件能够传递给activity,让acitvity做一些事情,这里就需要设置监听接口,让button的点击事件能够让外界activity知道。如下面的代码。
1 /**
2 * 设置确定按钮和取消被点击的接口 3 */
4 public interface onYesOnclickListener { 5 public void onYesClick(); 6 } 7
8 public interface onNoOnclickListener { 9 public void onNoClick(); 10 }
1 private onNoOnclickListener noOnclickListener;//取消按钮被点击了的监听器 2 private onYesOnclickListener yesOnclickListener;//确定按钮被点击了的监听器 3 4 /**
5 * 设置取消按钮的显示内容和监听 6 *
7 * @param str
8 * @param onNoOnclickListener 9 */
10 public void setNoOnclickListener(String str, onNoOnclickListener 11 onNoOnclickListener) { 12 if (str != null) { 13 noStr = str; 14 }
15 this.noOnclickListener = onNoOnclickListener;
磨砺营IT教育版权所有
http://www.moliying.com
16 } 17 18 /**
19 * 设置确定按钮的显示内容和监听 20 *
21 * @param str
22 * @param onYesOnclickListener 23 */
24 public void setYesOnclickListener(String str, onYesOnclickListener 25 onYesOnclickListener) { 26 if (str != null) { 27 yesStr = str; 28 }
this.yesOnclickListener = onYesOnclickListener; }
1 //设置确定按钮被点击后,向外界提供监听
2 yes.setOnClickListener(new View.OnClickListener() { 3 @Override
4 public void onClick(View v) { 5 if (yesOnclickListener != null) { 6 yesOnclickListener.onYesClick(); 7 } 8 } 9 });
10 //设置取消按钮被点击后,向外界提供监听
11 no.setOnClickListener(new View.OnClickListener() { 12 @Override
13 public void onClick(View v) { 14 if (noOnclickListener != null) { 15 noOnclickListener.onNoClick(); 16 } 17 }
磨砺营IT教育版权所有
http://www.moliying.com
18 });
Activity就可以设置监听接口来实时获取button的点击事件如下:
selfDialog.setYesOnclickListener(\确定\, new SelfDialog.onYesOnclickListener() { 1 @Override
2 public void onYesClick() {
3 Toast.makeText(MainActivity.this,\点击了--确定--按钮4 \,Toast.LENGTH_LONG).show();
5 selfDialog.dismiss(); 6 } 7 });
8 selfDialog.setNoOnclickListener(\取消\, new 9 SelfDialog.onNoOnclickListener() { 10 @Override
11 public void onNoClick() {
12 Toast.makeText(MainActivity.this,\点击了--取消--按钮13 \,Toast.LENGTH_LONG).show();
14 selfDialog.dismiss(); } });
通过上面4步的详细讲解,就能知道自定义dialog的一般原理,基本就是 要为dialog设置一些基本的文字信息时,就直接用公开方法public 的方法,让外界直接设置;如果要让activity监听到button之类的点击事件就自定义接口,用监听接口的方式向activity传递点击事件。
设置Dialog布局的几种方式
如果丑的话要设置dialog的主题样式,继承Theme.Dialog 并在构造方法里面放入
1.关键在下面的两行,使用window.setContentView,替换整个对话框窗口的布局
Window window = dialog.getWindow();
磨砺营IT教育版权所有
http://www.moliying.com
window.setContentView(R.layout.alertdialog); 2.直接用dialog的setContentView
View layout = inflater.inflate(R.layout.dialog_share_qrcode, null); dialog.addContentView(layout, new LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT , android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); dialog.setContentView(layout); 修改普通对话框的位置、大小、透明度
主要是在普通的dialog.show() 下面加上如下代码
//放在show()之后,不然有些属性是没有效果的,比如height和width 1
Window dialogWindow = dialog.getWindow(); 2
WindowManager m = getWindowManager(); 3
Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用 4
WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当5
前的参数值 6
//设置高度和宽度 7
p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6 8
p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65 9
//设置位置 10
p.gravity = Gravity.BOTTOM; 11
//设置透明度 12
p.alpha = 0.5f; 13
dialogWindow.setAttributes(p); OR
1 Window dialogWindow = getWindow();
磨砺营IT教育版权所有
http://www.moliying.com
2 WindowManager.LayoutParams lp = dialogWindow.getAttributes();
3 DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、4 高用
5 lp.width = (int) (d.widthPixels * 0.8); // 高度设置为屏幕的0.6 dialogWindow.setAttributes(lp);
磨砺营IT教育版权所有
正在阅读:
Android培训教程-自定义对话框Dialog的几种方式05-16
法庭审判观后感04-24
部编人教版九年级世界历史上册教学计划09-01
广西北海市八年级数学上册1.3.2零次幂和负整数指数幂导学案03-27
小学毕业后的作文06-15
中国梦小学生优秀作文03-12
2022-2022年邢台市邢台经济开发区思源实验学校一年级下册数学复04-08
YY资源中心频道类型认证02-10
实验七 - 操作系统页面调度算法01-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 对话框
- 定义
- Android
- 方式
- 教程
- 培训
- Dialog
- 小学生作文题目大全(人,事,景,物)
- 五年级下册数学分数加减法混合运算练习题
- 室内分布日常维护手册 - 图文
- 高中生物竞赛辅导
- 潜江华润LNG加气加注站招标书文件-2014.6.17
- 飞机场安检系统
- 数组作业
- 中小企业会计电算化实施存在问题及对策分析
- 论文:数学思想方法
- 河南省沁阳市2017届高三生物下学期第一次周考试题
- 数字图像处理论文
- 小班化教学形式下小组合作学习的研究
- 民族团结教育主题队会教案1
- 机械设计课程设计--二级减速器圆锥齿轮机械设计
- 沁园春雪原文(加拼音)
- 重庆交通大学船舶设计原理
- 2019年中考数学浙江省温州市瑞安市五校联考2019届九年级中考学业
- (精品)新人教版《语文园地一我的发现日积月累》公开课教案 - 7
- 小学二年级国学经典校本教材前言、目录
- 为孩子的阅读领航 付丽丽