现今的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
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
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
|
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]
纯文本查看
复制代码
1
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
使用:
完成了以上步骤之后,在需要调用的地方写上如下代码就可以启动我们的自定义
Dialog
啦。
[Java]
纯文本查看
复制代码
1
2
3
|
MyDialog myDialog =
new
MyDialog(
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
|
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]
纯文本查看
复制代码
1
|
android:theme="@android:style/Theme.Dialog"
|
使用:
既然只是可以界面稍有不同的activity
,那么在调用上也是跟
activity
的调用一样
[Java]
纯文本查看
复制代码
1
|
startActivity(
new
Intent(
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
|
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]
纯文本查看
复制代码
1
|
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]
纯文本查看
复制代码
三种方式的优缺点
1
、
Dialog
的位置相对固定,而
PopupWindow
的位置可以随意
2
、
Dialog
是非阻塞线程的,而
PopupWindow
是阻塞线程的
3
、
activity
的方式是位置可以相对随意,并非阻塞线程