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

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

f2a965da415be19dcdf701f27b0e3315.png

定义外观

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

b75c8c23fd895f7db988945beba2c8dc.png

该对话框将支持下面特性: 可从资源或者字符串直接指定对话框标题

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

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

编写布局、样式和主题

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

01<?xml version="1.0" encoding="utf-8"?>

02

03

04android:orientation="vertical"

05android:layout_width="fill_parent"

06android:minWidth="280dip"

07android:layout_height="wrap_content">

08

09

10

11android:orientation="vertical"

12android:background="@drawable/header"

13android:layout_width="fill_parent"

14android:layout_height="wrap_content">

15

16

17style="@style/DialogText.Title"

18

19android:id="@+id/title"

20android:paddingRight="8dip"

21android:paddingLeft="8dip"

22android:background="@drawable/title"

23android:layout_width="wrap_content"

24

25android:layout_height="wrap_content"/>

26

27

28

29

30android:id="@+id/content"

31android:orientation="vertical"

32android:background="@drawable/center"

33

34android:layout_width="fill_parent"

35android:layout_height="wrap_content">

36

37

38style="@style/DialogText"

39android:id="@+id/message"

40android:padding="5dip"

41

42android:layout_width="fill_parent"

43android:layout_height="wrap_content"/>

44

45

46

47

48android:orientation="horizontal"

49android:background="@drawable/footer"

50

51android:layout_width="fill_parent"

52android:layout_height="wrap_content">

53

54

55android:id="@+id/positiveButton"

56android:layout_marginTop="3dip"

57android:layout_width="0dip"

58

59android:layout_weight="1"

60android:layout_height="wrap_content"

61android:singleLine="true"/>

62

63

64android:id="@+id/negativeButton"

65

66android:layout_marginTop="3dip"

67android:layout_width="0dip"

68android:layout_weight="1"

69android:layout_height="wrap_content"

70android:singleLine="true"/>

71

72

73

74

75

根节点 LinearLayout 的宽度设置为 fill_parent 而最小的宽度是 280dip ,因此对话框的宽度将始终为屏幕宽度的 87.5%

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

01<?xml version="1.0" encoding="utf-8"?>

02

03

04

05@null

06

07true

08true

09

10

11

接下来我们需要定义对话框的标题和消息的显示:

01<?xml version="1.0" encoding="utf-8"?>

02

03

04

05#FF000000

06

0712sp

08

09

10

1116sp

12

13bold

14

15

16

编写对话框和 Builder 类

001package net.androgames.blog.sample.customdialog.dialog;

002

003import net.androgames.blog.sample.customdialog.R;

004import android.app.Dialog;

005import android.content.Context;

006import android.content.DialogInterface;

007import android.view.LayoutInflater;

008import android.view.View;

009import android.view.ViewGroup.LayoutParams;

010import android.widget.Button;

011import android.widget.LinearLayout;

012import android.widget.TextView;

013

014/**

015*

016* Create custom Dialog windows for your application

017* Custom dialogs rely on custom layouts wich allow you to

018* create and use your own look & feel.

019*

020* Under GPL v3 : http://www.gnu.org/licenses/gpl-3.0.html

021*

022* @author antoine vianey

023*

024*/

025public class CustomDialogextends Dialog {

026

027public CustomDialog(Context context,int theme) {

028super(context, theme);

029}

030

031public CustomDialog(Context context) {

032super(context);

033}

034

035/**

036* Helper class for creating a custom dialog

037*/

038public static class Builder {

039

040private Context context;

041private String title;

042private String message;

043private String positiveButtonText;

044private String negativeButtonText;

045private View contentView;

046

047private DialogInterface.OnClickListener

048positiveButtonClickListener,

049negativeButtonClickListener;

050

051public Builder(Context context) {

052this.context = context;

053}

054

055/**

056* Set the Dialog message from String

057* @param title

058* @return

059*/

060public Builder setMessage(String message) {

061this.message = message;

062return this;

063}

064

065/**

066* Set the Dialog message from resource

067* @param title

068* @return

069*/

070public Builder setMessage(int message) {

071this.message = (String) context.getText(message);

072return this;

073}

074

075/**

076* Set the Dialog title from resource

077* @param title

078* @return

079*/

080public Builder setTitle(int title) {

081this.title = (String) context.getText(title);

082return this;

083}

084

085/**

086* Set the Dialog title from String

087* @param title

088* @return

089*/

090public Builder setTitle(String title) {

091this.title = title;

092return this;

093}

094

095/**

096* Set a custom content view for the Dialog.

097* If a message is set, the contentView is not

098* added to the Dialog...

099* @param v

100* @return

101*/

102public Builder setContentView(View v) {

103this.contentView = v;

104return this;

105}

106

107/**

108* Set the positive button resource and it's listener

109* @param positiveButtonText

110* @param listener

111* @return

112*/

113public Builder setPositiveButton(int positiveButtonText,

114DialogInterface.OnClickListener listener) {

115this.positiveButtonText = (String) context

116.getText(positiveButtonText);

117this.positiveButtonClickListener = listener;

118return this;

119}

120

121/**

122* Set the positive button text and it's listener

123* @param positiveButtonText

124* @param listener

125* @return

126*/

127public Builder setPositiveButton(String positiveButtonText,

128DialogInterface.OnClickListener listener) {

129this.positiveButtonText = positiveButtonText;

130this.positiveButtonClickListener = listener;

131return this;

132}

133

134/**

135* Set the negative button resource and it's listener

136* @param negativeButtonText

137* @param listener

138* @return

139*/

140public Builder setNegativeButton(int negativeButtonText,

141DialogInterface.OnClickListener listener) {

142this.negativeButtonText = (String) context

143.getText(negativeButtonText);

144this.negativeButtonClickListener = listener;

145return this;

146}

147

148/**

149* Set the negative button text and it's listener

150* @param negativeButtonText

151* @param listener

152* @return

153*/

154public Builder setNegativeButton(String negativeButtonText,

155DialogInterface.OnClickListener listener) {

156this.negativeButtonText = negativeButtonText;

157this.negativeButtonClickListener = listener;

158return this;

159}

160

161/**

162* Create the custom dialog

163*/

164public CustomDialog create() {

165LayoutInflater inflater = (LayoutInflater) context

166.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

167// instantiate the dialog with the custom Theme

168final CustomDialog dialog =new CustomDialog(context,

169R.style.Dialog);

170View layout = inflater.inflate(R.layout.dialog,null);

171dialog.addContentView(layout,new LayoutParams(

172LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

173// set the dialog title

174((TextView) layout.findViewById(R.id.title)).setText(title);

175// set the confirm button

176if (positiveButtonText !=null) {

177((Button) layout.findViewById(R.id.positiveButton))

178.setText(positiveButtonText);

179if (positiveButtonClickListener !=null) {

180((Button) layout.findViewById(R.id.positiveButton))

181.setOnClickListener(new View.OnClickListener() {

182public void onClick(View v) {

183positiveButtonClickListener.onClick(

184dialog,

185DialogInterface.BUTTON_POSITIVE);

186}

187});

188}

189}else {

190// if no confirm button just set the visibility to GONE

191layout.findViewById(R.id.positiveButton).setVisibility(

192View.GONE);

193}

194// set the cancel button

195if (negativeButtonText !=null) {

196((Button) layout.findViewById(R.id.negativeButton))

197.setText(negativeButtonText);

198if (negativeButtonClickListener !=null) {

199((Button) layout.findViewById(R.id.negativeButton))

200.setOnClickListener(new View.OnClickListener() {

201public void onClick(View v) {

202positiveButtonClickListener.onClick(

203dialog,

204DialogInterface.BUTTON_NEGATIVE);

205}

206});

207}

208}else {

209// if no confirm button just set the visibility to GONE

210layout.findViewById(R.id.negativeButton).setVisibility(

211View.GONE);

212}

213// set the content message

214if (message !=null) {

215((TextView) layout.findViewById(

216R.id.message)).setText(message);

217}else if (contentView !=null) {

218// if no message set

219// add the contentView to the dialog body

220((LinearLayout) layout.findViewById(R.id.content))

221.removeAllViews();

222((LinearLayout) layout.findViewById(R.id.content))

223.addView(contentView,

224new LayoutParams(

225LayoutParams.WRAP_CONTENT,

226LayoutParams.WRAP_CONTENT));

227}

228dialog.setContentView(layout);

229return dialog;

230}

231

232}

233

234}

使用自定义的 Builder

使用方法很简单:

01/**

02* Build the desired Dialog

03* CUSTOM or DEFAULT

04*/

05@Override

06public Dialog onCreateDialog(int dialogId) {

07Dialog dialog =null;

08switch (dialogId) {

09case CUSTOM_DIALOG :

10CustomDialog.Builder customBuilder =new

11CustomDialog.Builder(CustomDialogActivity.this);

12customBuilder.setTitle("Custom title")

13.setMessage("Custom body")

14.setNegativeButton("Cancel",

15new DialogInterface.OnClickListener() {

16public void onClick(DialogInterface dialog,int which) {

17CustomDialogActivity.this

18.dismissDialog(CUSTOM_DIALOG);

19}

20})

21.setPositiveButton("Confirm",

22new DialogInterface.OnClickListener() {

23public void onClick(DialogInterface dialog,int which) {

24dialog.dismiss();

25}

26});

27dialog = customBuilder.create();

28break;

29case DEFAULT_DIALOG :

30AlertDialog.Builder alertBuilder =new

31AlertDialog.Builder(CustomDialogActivity.this);

32alertBuilder.setTitle("Default title")

33.setMessage("Default body")

34.setNegativeButton("Cancel",

35new DialogInterface.OnClickListener() {

36public void onClick(DialogInterface dialog,int which) {

37dialog.dismiss();

38}

39})

40.setPositiveButton("Confirm",

41new DialogInterface.OnClickListener() {

42public void onClick(DialogInterface dialog,int which) {

43CustomDialogActivity.this

44.dismissDialog(DEFAULT_DIALOG);

45}

46});

47dialog = alertBuilder.create();

48break;

49}

50return dialog;51}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值