展会信息港展会大全

自定义 Android对话框 (AlertDialog) 的样式
来源:互联网   发布日期:2015-10-03 11:29:48   浏览:2840次  

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

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

定义外观

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

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

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

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

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

编写布局、样式和主题

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

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

02 <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

03android:orientation="vertical"

04android:layout_width="fill_parent"

05android:minWidth="280dip"

06android:layout_height="wrap_content">

07

08<LinearLayout

09android:orientation="vertical"

10android:background="@drawable/header"

11android:layout_width="fill_parent"

12android:layout_height="wrap_content">

13

14<TextView

15style="@style/DialogText.Title"

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

17android:paddingRight="8dip"

18android:paddingLeft="8dip"

19android:background="@drawable/title"

20android:layout_width="wrap_content"

21android:layout_height="wrap_content"/>

22

23</LinearLayout>

24

25<LinearLayout

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

27android:orientation="vertical"

28android:background="@drawable/center"

29android:layout_width="fill_parent"

30android:layout_height="wrap_content">

31

32<TextView

33style="@style/DialogText"

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

35android:padding="5dip"

36android:layout_width="fill_parent"

37android:layout_height="wrap_content"/>

38

39</LinearLayout>

40

41<LinearLayout

42android:orientation="horizontal"

43android:background="@drawable/footer"

44android:layout_width="fill_parent"

45android:layout_height="wrap_content">

46

47<Button

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

49android:layout_marginTop="3dip"

50android:layout_width="0dip"

51android:layout_weight="1"

52android:layout_height="wrap_content"

53android:singleLine="true"/>

54

55<Button

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

57android:layout_marginTop="3dip"

58android:layout_width="0dip"

59android:layout_weight="1"

60android:layout_height="wrap_content"

61android:singleLine="true"/>

62

63</LinearLayout>

64

65 </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<item name="android:windowNoTitle">true</item>

07<item name="android:windowIsFloating">true</item>

08</style>

09

10 </resources>

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

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

02 <resources>

03

04<style name="DialogText">

05<item name="android:textColor">#FF000000</item>

06<item name="android:textSize">12sp</item>

07</style>

08

09<style name="DialogText.Title">

10<item name="android:textSize">16sp</item>

11<item name="android:textStyle">bold</item>

12</style>

13

14 </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* 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* <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a> antoine vianey

023*

024*/

025 public class CustomDialog extends 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

047privateDialogInterface.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 = newCustomDialog(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(newView.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(newView.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

06 public 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, intwhich) {

17CustomDialogActivity.this

18.dismissDialog(CUSTOM_DIALOG);

19}

20})

21.setPositiveButton("Confirm",

22new DialogInterface.OnClickListener() {

23public void onClick(DialogInterface dialog, intwhich) {

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, intwhich) {

37dialog.dismiss();

38}

39})

40.setPositiveButton("Confirm",

41new DialogInterface.OnClickListener() {

42public void onClick(DialogInterface dialog, intwhich) {

43CustomDialogActivity.this

44.dismissDialog(DEFAULT_DIALOG);

45}

46});

47dialog = alertBuilder.create();

48break;

49}

50return dialog;

51 }

赞助本站

人工智能实验室
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港