Android多种方式实现自定义Dialog对话框

来源:互联网 发布:uipath软件 编辑:程序博客网 时间:2024/06/07 14:42
现今的APP开发都很讲究用户体验,而系统提供的原生工具都长得比较丑,或者功能不满足我们的需求。这个时候我们想到的是自定义,而Dialog对话框也是经常需要自定义的一个工具。必须让它符合我们整体的风格!!下面就来介绍下三种自定义dialog的方法。



首先需要一个自定义的布局XML文件

自定义Dialog可以通过XML或者Java代码的方式去定义新Dialog的界面。在这里我们使用XML文件,这样会比较直观。

在下面我做了一个简单的布局来演示自定义功能。
xml文件的代码:
[XML] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?xmlversion="1.0"encoding="utf-8"?>
 
<RelativeLayoutxmlns: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] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
packagecom.apkbus.apkbusdialog;
 
  
 
importandroid.app.Dialog;
 
importandroid.content.Context;
 
importandroid.os.Bundle;
 
importandroid.view.View;
 
importandroid.widget.TextView;
 
  
 
  
 
publicclass MyDialog extendsDialog {
 
  
 
privateString dialogName;
 
 
  
 
publicMyDialog(Context context,String dialogName) {
 
super(context);
 
this.dialogName = dialogName;
 
}
 
  
 
@Override
 
protectedvoid 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(newView.OnClickListener() {
 
 
@Override
 
publicvoid onClick(View v) {
 
dismiss();
 
 
}
 
});
 
}
 
  
 
}


说明:
1、需要实现一个非默认的构造函数,如果没有系统会提示有错。
2、需要实现一个onCreate(Bundle savedInstanceState)方法,在这里可以通过setContentView(R.layout.my_dialog);方法设置您的自定义布局,然后就是对布局控件的绑定,初始化等操作了。
3、关于Dialog自带的标题栏,如果不需要可以通过在onCreate方法中调用以下方法来去掉标题栏
[Java] 纯文本查看 复制代码
?
1
requestWindowFeature(Window.FEATURE_NO_TITLE);



使用:

完成了以上步骤之后,在需要调用的地方写上如下代码就可以启动我们的自定义Dialog啦。

[Java] 纯文本查看 复制代码
?
1
2
3
MyDialog myDialog = newMyDialog(this,"我是继承Dialog类实现的自定义Dialog");
 
myDialog.show();


二、设置Activity属性实现
而这里是通过在AndroidManifest设置Activity的属性
[XML] 纯文本查看 复制代码
?
1
android:theme="@android:style/Theme.Dialog"

然后在activity就是平时的做法了。

[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
packagecom.apkbus.apkbusdialog;
 
  
 
importandroid.app.Activity;
 
importandroid.os.Bundle;
 
importandroid.view.View;
 
importandroid.view.View.OnClickListener;
 
importandroid.view.Window;
 
importandroid.widget.TextView;
 
  
 
publicclass DialogActivity extendsActivity{
 
 
@Override
 
protectedvoid 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(newOnClickListener() {
 
 
publicvoid onClick(View v) {
 
DialogActivity.this.finish();
 
 
}
 
});
 
}
 
}


说明:
就像上面的代码一样,activity中并不需要做什么特别的操作。只是一个界面变成了Dialog的普通activity,操作跟以前一样。
只需要在AndroidManifest设置Activity的属性
[XML] 纯文本查看 复制代码
?
1
android:theme="@android:style/Theme.Dialog"



使用:

既然只是可以界面稍有不同的activity,那么在调用上也是跟activity的调用一样

[Java] 纯文本查看 复制代码
?
1
startActivity(newIntent(this, DialogActivity.class));



三、用PopupWindow实现

PopupWindow实现的可能跟上面的风格是不一样的,PopupWindow通过简单的设置就可以使用自定义布局。

[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
privatevoid 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(newOnClickListener() {
 
 
@Override
 
publicvoid onClick(View v) {
 
myPopupWindow.dismiss();
 
 
}
 
});
 
myPopupWindow = newPopupWindow(dialogView, 600, LayoutParams.WRAP_CONTENT);
 
 
// 使其聚集
 
myPopupWindow.setFocusable(true);
 
        // 设置允许在外点击消失
 
myPopupWindow.setOutsideTouchable(true);
 
//设置背景,不设置背景点击返回按钮无法关闭PopupWindow
 
myPopupWindow.setBackgroundDrawable(newColorDrawable(Color.CYAN));
 
 
myPopupWindow.showAsDropDown(v);
 
}


说明:
PopupWindow的使用主要有下面几个步骤

1、使用LayoutInflater获得自定义布局的View对象
[Java] 纯文本查看 复制代码
?
1
View dialogView = LayoutInflater.from(this).inflate(R.layout.my_dialog,null);

2、初始化的时候设置我们的布局的View对象进去,同时设置PopupWindow的宽高。
[Java] 纯文本查看 复制代码
?
1
myPopupWindow = newPopupWindow(dialogView, 600, LayoutParams.WRAP_CONTENT);

3、显示PopupWindow,下面的方法是显示PopupWindow在某个view的下面。
[Java] 纯文本查看 复制代码
?
1
myPopupWindow.showAsDropDown(v);



使用:
在需要调用的位置调用上面的方法即可。
[Java] 纯文本查看 复制代码
?
1
showPopupWindow(v);


三种方式的优缺点
1Dialog的位置相对固定,而PopupWindow的位置可以随意
2Dialog是非阻塞线程的,而PopupWindow是阻塞线程的
3activity的方式是位置可以相对随意,并非阻塞线程

源码链接
http://www.apkbus.com/forum.php?mod=attachment&aid=MTk1NTI1fGU1ZGM0NjUxfDE0MzUyODUyNjB8MzUzOTg0fDI0MzYwMQ%3D%3D

0 0
原创粉丝点击