现今的APP开发都很讲究用户体验,而系统提供的原生工具都长得比较丑,或者功能不满足我们的需求。这个时候我们想到的是自定义,而Dialog对话框也是经常需要自定义的一个工具。必须让它符合我们整体的风格!!下面就来介绍下三种自定义dialog的方法。
首先需要一个自定义的布局XML文件
自定义Dialog可以通过XML或者Java代码的方式去定义新Dialog的界面。在这里我们使用XML文件,这样会比较直观。
在下面我做了一个简单的布局来演示自定义功能。
xml文件的代码:
[XML]
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="300dp" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="www.apkbus.com" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="14dp" android:text="自定义Dialog demo" /> <TextView android:id="@+id/dialog_name_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" android:text="TextView" /> <Button android:id="@+id/cancel_button" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_below="@+id/dialog_name_textview" android:layout_centerHorizontal="true" android:layout_marginTop="16dp" android:text="关闭" /> </RelativeLayout> |
一、继承Dialog类实现
这个也许是比较常用的一个方法了,通过继承Dialog类然后使用自己的布局文件来实现自定义。实现起来也是很简单的。
下面来看看代码:
[Java]
package com.apkbus.apkbusdialog; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MyDialog extends Dialog { private String dialogName; public MyDialog(Context context,String dialogName) { super(context); this.dialogName = dialogName; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.my_dialog); ((TextView) findViewById(R.id.dialog_name_textview)).setText(dialogName); findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); } } |
说明:
1、需要实现一个非默认的构造函数,如果没有系统会提示有错。
2、需要实现一个onCreate(Bundle savedInstanceState)方法,在这里可以通过setContentView(R.layout.my_dialog);方法设置您的自定义布局,然后就是对布局控件的绑定,初始化等操作了。
3、关于Dialog自带的标题栏,如果不需要可以通过在onCreate方法中调用以下方法来去掉标题栏
[Java]
requestWindowFeature(Window.FEATURE_NO_TITLE); |
使用:
完成了以上步骤之后,在需要调用的地方写上如下代码就可以启动我们的自定义Dialog啦。
[Java]
MyDialog myDialog = new MyDialog(this, "我是继承Dialog类实现的自定义Dialog"); myDialog.show(); |
二、设置Activity属性实现
而这里是通过在AndroidManifest设置Activity的属性
[XML] 纯文本查看 复制代码
android:theme="@android:style/Theme.Dialog" |
然后在activity就是平时的做法了。
[Java]
package com.apkbus.apkbusdialog; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.TextView; public class DialogActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.my_dialog); ((TextView) findViewById(R.id.dialog_name_textview)).setText("我是Activity实现的自定义dialog"); findViewById(R.id.cancel_button).setOnClickListener(new OnClickListener() { public void onClick(View v) { DialogActivity.this.finish(); } }); } } |
说明:
就像上面的代码一样,activity中并不需要做什么特别的操作。只是一个界面变成了Dialog的普通activity,操作跟以前一样。
只需要在AndroidManifest设置Activity的属性
[XML]
android:theme="@android:style/Theme.Dialog" |
使用:
既然只是可以界面稍有不同的activity,那么在调用上也是跟activity的调用一样
[Java] 纯文本查看 复制代码
startActivity(new Intent(this, DialogActivity.class)); |
三、用PopupWindow实现
PopupWindow实现的可能跟上面的风格是不一样的,PopupWindow通过简单的设置就可以使用自定义布局。
[Java]
private void showPopupWindow(View v){ View dialogView = LayoutInflater.from(this).inflate(R.layout.my_dialog, null); ((TextView) dialogView.findViewById(R.id.dialog_name_textview)).setText("我是PopupWindow实现的自定义Dialog"); dialogView.findViewById(R.id.cancel_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { myPopupWindow.dismiss(); } }); myPopupWindow = new PopupWindow(dialogView, 600, LayoutParams.WRAP_CONTENT); // 使其聚集 myPopupWindow.setFocusable(true); // 设置允许在外点击消失 myPopupWindow.setOutsideTouchable(true); //设置背景,不设置背景点击返回按钮无法关闭PopupWindow myPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.CYAN)); myPopupWindow.showAsDropDown(v); } |
说明:
PopupWindow的使用主要有下面几个步骤
1、使用LayoutInflater获得自定义布局的View对象
[Java] 纯文本查看 复制代码
View dialogView = LayoutInflater.from(this).inflate(R.layout.my_dialog, null); |
2、初始化的时候设置我们的布局的View对象进去,同时设置PopupWindow的宽高。
[Java] 纯文本查看 复制代码
1 | myPopupWindow = new PopupWindow(dialogView, 600, LayoutParams.WRAP_CONTENT); |
3、显示PopupWindow,下面的方法是显示PopupWindow在某个view的下面。
[Java] 纯文本查看 复制代码
1 | myPopupWindow.showAsDropDown(v); |
使用:
在需要调用的位置调用上面的方法即可。
[Java]
showPopupWindow(v); |
三种方式的优缺点
1、Dialog的位置相对固定,而PopupWindow的位置可以随意
2、Dialog是非阻塞线程的,而PopupWindow是阻塞线程的
3、activity的方式是位置可以相对随意,并非阻塞线程
赞赏历史上的文章
- 2017: Ubuntu终端提示:无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) 解决方法( 0)
- 2016: 独立日2卷土重来电影-百度云下载( 1)
- 2016: WordPress复制内容自动添加原文链接( 0)
- 2016: WordPress技巧-几步防止博客被黑客光顾( 0)
除特别注明外,本站所有文章均为LJY IT BLOG原创,转载请注明出处来自https://www.ljy2345.com/2015/07/android%e5%a4%9a%e7%a7%8d%e6%96%b9%e5%bc%8f%e5%ae%9e%e7%8e%b0%e8%87%aa%e5%ae%9a%e4%b9%89dialog%e5%af%b9%e8%af%9d%e6%a1%86/
Comments | NOTHING