您的位置:首页 > 移动开发 > Android开发

自定义 Android 对话框 (AlertDialog) 的样式

2013-06-26 09:33 567 查看
Android提供了AlertDialog类可通过其内部类Builder轻松创建对话框窗口,但是没法对这个对话框窗口进行定制,为了修改AlertDialog窗口显示的外观,解决的办法就是创建一个指定的AlertDialog和AlertDialog.Builder类。



定义外观

我们希望将上面默认的对话框外观修改为如下图所示的新对话框风格:



该对话框将支持下面特性:

可从资源或者字符串直接指定对话框标题

可从资源、字符串和自定义布局来设置对话框内容

可设置按钮和相应的事件处理

编写布局、样式和主题

该对话框使用一个定制的布局来输出内容,布局定义的id将用于访问标题TextView,下面是定义文件:

查看源码

打印?

01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
03
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
04
android:orientation
=
"vertical"
05
android:layout_width
=
"fill_parent"
06
android:minWidth
=
"280dip"
07
android:layout_height
=
"wrap_content"
>
08
09
10
<
LinearLayout
11
android:orientation
=
"vertical"
12
android:background
=
"@drawable/header"
13
android:layout_width
=
"fill_parent"
14
android:layout_height
=
"wrap_content"
>
15
16
<
TextView
17
style
=
"@style/DialogText.Title"
18
19
android:id
=
"@+id/title"
20
android:paddingRight
=
"8dip"
21
android:paddingLeft
=
"8dip"
22
android:background
=
"@drawable/title"
23
android:layout_width
=
"wrap_content"
24
25
android:layout_height
=
"wrap_content"
/>
26
27
</
LinearLayout
>
28
29
<
LinearLayout
30
android:id
=
"@+id/content"
31
android:orientation
=
"vertical"
32
android:background
=
"@drawable/center"
33
34
android:layout_width
=
"fill_parent"
35
android:layout_height
=
"wrap_content"
>
36
37
<
TextView
38
style
=
"@style/DialogText"
39
android:id
=
"@+id/message"
40
android:padding
=
"5dip"
41
42
android:layout_width
=
"fill_parent"
43
android:layout_height
=
"wrap_content"
/>
44
45
</
LinearLayout
>
46
47
<
LinearLayout
48
android:orientation
=
"horizontal"
49
android:background
=
"@drawable/footer"
50
51
android:layout_width
=
"fill_parent"
52
android:layout_height
=
"wrap_content"
>
53
54
<
Button
55
android:id
=
"@+id/positiveButton"
56
android:layout_marginTop
=
"3dip"
57
android:layout_width
=
"0dip"
58
59
android:layout_weight
=
"1"
60
android:layout_height
=
"wrap_content"
61
android:singleLine
=
"true"
/>
62
63
<
Button
64
android:id
=
"@+id/negativeButton"
65
66
android:layout_marginTop
=
"3dip"
67
android:layout_width
=
"0dip"
68
android:layout_weight
=
"1"
69
android:layout_height
=
"wrap_content"
70
android:singleLine
=
"true"
/>
71
72
73
</
LinearLayout
>
74
75
</
LinearLayout
>
根节点LinearLayout的宽度设置为fill_parent而最小的宽度是280dip,因此对话框的宽度将始终为屏幕宽度的87.5%

自定义的主题用于声明对话框是浮动的,而且使用自定义的背景和标题视图:

查看源码

打印?

01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
resources
>
03
04
<
style
name
=
"Dialog"
parent
=
"android:style/Theme.Dialog"
>
05
<
item
name
=
"android:windowBackground"
>@null</
item
>
06
07
<
item
name
=
"android:windowNoTitle"
>true</
item
>
08
<
item
name
=
"android:windowIsFloating"
>true</
item
>
09
</
style
>
10
11
</
resources
>
接下来我们需要定义对话框的标题和消息的显示:

查看源码

打印?

01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
resources
>
03
04
<
style
name
=
"DialogText"
>
05
<
item
name
=
"android:textColor"
>#FF000000</
item
>
06
07
<
item
name
=
"android:textSize"
>12sp</
item
>
08
</
style
>
09
10
<
style
name
=
"DialogText.Title"
>
11
<
item
name
=
"android:textSize"
>16sp</
item
>
12
13
<
item
name
=
"android:textStyle"
>bold</
item
>
14
</
style
>
15
16
</
resources
>

编写对话框和Builder类

最好我们要提供跟AletDialog.Builder类一样的方法:

查看源码

打印?

001
package
net.androgames.blog.sample.customdialog.dialog;
002
003
import
net.androgames.blog.sample.customdialog.R;
004
import
android.app.Dialog;
005
import
android.content.Context;
006
import
android.content.DialogInterface;
007
import
android.view.LayoutInflater;
008
import
android.view.View;
009
import
android.view.ViewGroup.LayoutParams;
010
import
android.widget.Button;
011
import
android.widget.LinearLayout;
012
import
android.widget.TextView;
013
014
/**
015
*
016
*CreatecustomDialogwindowsforyourapplication
017
*Customdialogsrelyoncustomlayoutswichallowyouto
018
*createanduseyourownlook&feel.
019
*
'target='_blank'>http://www.gnu.org/licenses/gpl-3.0.html[/code]
020
*UnderGPLv3:
021
*
022
*@authorantoinevianey
023
*
024
*/
025
public
class
CustomDialog
extends
Dialog{
026
027
public
CustomDialog(Contextcontext,
int
theme){
028
super
(context,theme);
029
}
030
031
public
CustomDialog(Contextcontext){
032
super
(context);
033
}
034
035
/**
036
*Helperclassforcreatingacustomdialog
037
*/
038
public
static
class
Builder{
039
040
private
Contextcontext;
041
private
Stringtitle;
042
private
Stringmessage;
043
private
StringpositiveButtonText;
044
private
StringnegativeButtonText;
045
private
ViewcontentView;
046
047
private
DialogInterface.OnClickListener
048
positiveButtonClickListener,
049
negativeButtonClickListener;
050
051
public
Builder(Contextcontext){
052
this
.context=context;
053
}
054
055
/**
056
*SettheDialogmessagefromString
057
*@paramtitle
058
*@return
059
*/
060
public
BuildersetMessage(Stringmessage){
061
this
.message=message;
062
return
this
;
063
}
064
065
/**
066
*SettheDialogmessagefromresource
067
*@paramtitle
068
*@return
069
*/
070
public
BuildersetMessage(
int
message){
071
this
.message=(String)context.getText(message);
072
return
this
;
073
}
074
075
/**
076
*SettheDialogtitlefromresource
077
*@paramtitle
078
*@return
079
*/
080
public
BuildersetTitle(
int
title){
081
this
.title=(String)context.getText(title);
082
return
this
;
083
}
084
085
/**
086
*SettheDialogtitlefromString
087
*@paramtitle
088
*@return
089
*/
090
public
BuildersetTitle(Stringtitle){
091
this
.title=title;
092
return
this
;
093
}
094
095
/**
096
*SetacustomcontentviewfortheDialog.
097
*Ifamessageisset,thecontentViewisnot
098
*addedtotheDialog...
099
*@paramv
100
*@return
101
*/
102
public
BuildersetContentView(Viewv){
103
this
.contentView=v;
104
return
this
;
105
}
106
107
/**
108
*Setthepositivebuttonresourceandit'slistener
109
*@parampositiveButtonText
110
*@paramlistener
111
*@return
112
*/
113
public
BuildersetPositiveButton(
int
positiveButtonText,
114
DialogInterface.OnClickListenerlistener){
115
this
.positiveButtonText=(String)context
116
.getText(positiveButtonText);
117
this
.positiveButtonClickListener=listener;
118
return
this
;
119
}
120
121
/**
122
*Setthepositivebuttontextandit'slistener
123
*@parampositiveButtonText
124
*@paramlistener
125
*@return
126
*/
127
public
BuildersetPositiveButton(StringpositiveButtonText,
128
DialogInterface.OnClickListenerlistener){
129
this
.positiveButtonText=positiveButtonText;
130
this
.positiveButtonClickListener=listener;
131
return
this
;
132
}
133
134
/**
135
*Setthenegativebuttonresourceandit'slistener
136
*@paramnegativeButtonText
137
*@paramlistener
138
*@return
139
*/
140
public
BuildersetNegativeButton(
int
negativeButtonText,
141
DialogInterface.OnClickListenerlistener){
142
this
.negativeButtonText=(String)context
143
.getText(negativeButtonText);
144
this
.negativeButtonClickListener=listener;
145
return
this
;
146
}
147
148
/**
149
*Setthenegativebuttontextandit'slistener
150
*@paramnegativeButtonText
151
*@paramlistener
152
*@return
153
*/
154
public
BuildersetNegativeButton(StringnegativeButtonText,
155
DialogInterface.OnClickListenerlistener){
156
this
.negativeButtonText=negativeButtonText;
157
this
.negativeButtonClickListener=listener;
158
return
this
;
159
}
160
161
/**
162
*Createthecustomdialog
163
*/
164
public
CustomDialogcreate(){
165
LayoutInflaterinflater=(LayoutInflater)context
166
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
167
//instantiatethedialogwiththecustomTheme
168
final
CustomDialogdialog=
new
CustomDialog(context,
169
R.style.Dialog);
170
Viewlayout=inflater.inflate(R.layout.dialog,
null
);
171
dialog.addContentView(layout,
new
LayoutParams(
172
LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
173
//setthedialogtitle
174
((TextView)layout.findViewById(R.id.title)).setText(title);
175
//settheconfirmbutton
176
if
(positiveButtonText!=
null
){
177
((Button)layout.findViewById(R.id.positiveButton))
178
.setText(positiveButtonText);
179
if
(positiveButtonClickListener!=
null
){
180
((Button)layout.findViewById(R.id.positiveButton))
181
.setOnClickListener(
new
View.OnClickListener(){
182
public
void
onClick(Viewv){
183
positiveButtonClickListener.onClick(
184
dialog,
185
DialogInterface.BUTTON_POSITIVE);
186
}
187
});
188
}
189
}
else
{
190
//ifnoconfirmbuttonjustsetthevisibilitytoGONE
191
layout.findViewById(R.id.positiveButton).setVisibility(
192
View.GONE);
193
}
194
//setthecancelbutton
195
if
(negativeButtonText!=
null
){
196
((Button)layout.findViewById(R.id.negativeButton))
197
.setText(negativeButtonText);
198
if
(negativeButtonClickListener!=
null
){
199
((Button)layout.findViewById(R.id.negativeButton))
200
.setOnClickListener(
new
View.OnClickListener(){
201
public
void
onClick(Viewv){
202
positiveButtonClickListener.onClick(
203
dialog,
204
DialogInterface.BUTTON_NEGATIVE);
205
}
206
});
207
}
208
}
else
{
209
//ifnoconfirmbuttonjustsetthevisibilitytoGONE
210
layout.findViewById(R.id.negativeButton).setVisibility(
211
View.GONE);
212
}
213
//setthecontentmessage
214
if
(message!=
null
){
215
((TextView)layout.findViewById(
216
R.id.message)).setText(message);
217
}
else
if
(contentView!=
null
){
218
//ifnomessageset
219
//addthecontentViewtothedialogbody
220
((LinearLayout)layout.findViewById(R.id.content))
221
.removeAllViews();
222
((LinearLayout)layout.findViewById(R.id.content))
223
.addView(contentView,
224
new
LayoutParams(
225
LayoutParams.WRAP_CONTENT,
226
LayoutParams.WRAP_CONTENT));
227
}
228
dialog.setContentView(layout);
229
return
dialog;
230
}
231
232
}
233
234
}

使用自定义的Builder

使用方法很简单:

查看源码

打印?

01
/**
02
*BuildthedesiredDialog
03
*CUSTOMorDEFAULT
04
*/
05
@Override
06
public
DialogonCreateDialog(
int
dialogId){
07
Dialogdialog=
null
;
08
switch
(dialogId){
09
case
CUSTOM_DIALOG:
10
CustomDialog.BuildercustomBuilder=
new
11
CustomDialog.Builder(CustomDialogActivity.
this
);
12
customBuilder.setTitle(
"Customtitle"
)
13
.setMessage(
"Custombody"
)
14
.setNegativeButton(
"Cancel"
,
15
new
DialogInterface.OnClickListener(){
16
public
void
onClick(DialogInterfacedialog,
int
which){
17
CustomDialogActivity.
this
18
.dismissDialog(CUSTOM_DIALOG);
19
}
20
})
21
.setPositiveButton(
"Confirm"
,
22
new
DialogInterface.OnClickListener(){
23
public
void
onClick(DialogInterfacedialog,
int
which){
24
dialog.dismiss();
25
}
26
});
27
dialog=customBuilder.create();
28
break
;
29
case
DEFAULT_DIALOG:
30
AlertDialog.BuilderalertBuilder=
new
31
AlertDialog.Builder(CustomDialogActivity.
this
);
32
alertBuilder.setTitle(
"Defaulttitle"
)
33
.setMessage(
"Defaultbody"
)
34
.setNegativeButton(
"Cancel"
,
35
new
DialogInterface.OnClickListener(){
36
public
void
onClick(DialogInterfacedialog,
int
which){
37
dialog.dismiss();
38
}
39
})
40
.setPositiveButton(
"Confirm"
,
41
new
DialogInterface.OnClickListener(){
42
public
void
onClick(DialogInterfacedialog,
int
which){
43
CustomDialogActivity.
this
44
.dismissDialog(DEFAULT_DIALOG);
45
}
46
});
47
dialog=alertBuilder.create();
48
break
;
49
}
50
return
dialog;
51
}
完整的代码下载:SampleCustomDialog

Enjoy!
http://blog.androgames.net/10/custom-android-dialog/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: