自定义对话框样式

来源:互联网 发布:分层数据分析 编辑:程序博客网 时间:2024/06/14 02:38

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

Android default Dialog

定义外观

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

Custom Android Dialog

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

  1. 可从资源或者字符串直接指定对话框标题
  2. 可从资源、字符串和自定义布局来设置对话框内容
  3. 可设置按钮和相应的事件处理

编写布局、样式和主题

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

查看源码
打印?
01<?xmlversion="1.0"encoding="utf-8"?>
02
03<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
04android:orientation="vertical"
05android:layout_width="fill_parent"
06android:minWidth="280dip"
07android:layout_height="wrap_content">
08
09
10<LinearLayout
11android:orientation="vertical"
12android:background="@drawable/header"
13android:layout_width="fill_parent"
14android:layout_height="wrap_content">
15
16<TextView
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</LinearLayout>
28
29<LinearLayout
30android:id="@+id/content"
31android:orientation="vertical"
32android:background="@drawable/center"
33
34android:layout_width="fill_parent"
35android:layout_height="wrap_content">
36
37<TextView
38style="@style/DialogText"
39android:id="@+id/message"
40android:padding="5dip"
41
42android:layout_width="fill_parent"
43android:layout_height="wrap_content"/>
44
45</LinearLayout>
46
47<LinearLayout
48android:orientation="horizontal"
49android:background="@drawable/footer"
50
51android:layout_width="fill_parent"
52android:layout_height="wrap_content">
53
54<Button
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<Button
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</LinearLayout>
74
75</LinearLayout>

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

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

查看源码
打印?
01<?xmlversion="1.0"encoding="utf-8"?>
02<resources>
03
04<stylename="Dialog"parent="android:style/Theme.Dialog">
05<itemname="android:windowBackground">@null</item>
06
07<itemname="android:windowNoTitle">true</item>
08<itemname="android:windowIsFloating">true</item>
09</style>
10
11</resources>

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

查看源码
打印?
01<?xmlversion="1.0"encoding="utf-8"?>
02<resources>
03
04<stylename="DialogText">
05<itemname="android:textColor">#FF000000</item>
06
07<itemname="android:textSize">12sp</item>
08</style>
09
10<stylename="DialogText.Title">
11<itemname="android:textSize">16sp</item>
12
13<itemname="android:textStyle">bold</item>
14</style>
15
16</resources>

编写对话框和 Builder 类

最好我们要提供跟 AletDialog.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 CustomDialog extendsDialog {
026
027publicCustomDialog(Context context, inttheme) {
028super(context, theme);
029}
030
031publicCustomDialog(Context context) {
032super(context);
033}
034
035/**
036* Helper class for creating a custom dialog
037*/
038publicstatic class Builder {
039
040privateContext context;
041privateString title;
042privateString message;
043privateString positiveButtonText;
044privateString negativeButtonText;
045privateView contentView;
046
047privateDialogInterface.OnClickListener
048positiveButtonClickListener,
049negativeButtonClickListener;
050
051publicBuilder(Context context) {
052this.context = context;
053}
054
055/**
056* Set the Dialog message from String
057* @param title
058* @return
059*/
060publicBuilder setMessage(String message) {
061this.message = message;
062returnthis;
063}
064
065/**
066* Set the Dialog message from resource
067* @param title
068* @return
069*/
070publicBuilder setMessage(intmessage) {
071this.message = (String) context.getText(message);
072returnthis;
073}
074
075/**
076* Set the Dialog title from resource
077* @param title
078* @return
079*/
080publicBuilder setTitle(inttitle) {
081this.title = (String) context.getText(title);
082returnthis;
083}
084
085/**
086* Set the Dialog title from String
087* @param title
088* @return
089*/
090publicBuilder setTitle(String title) {
091this.title = title;
092returnthis;
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*/
102publicBuilder setContentView(View v) {
103this.contentView = v;
104returnthis;
105}
106
107/**
108* Set the positive button resource and it's listener
109* @param positiveButtonText
110* @param listener
111* @return
112*/
113publicBuilder setPositiveButton(intpositiveButtonText,
114DialogInterface.OnClickListener listener) {
115this.positiveButtonText = (String) context
116.getText(positiveButtonText);
117this.positiveButtonClickListener = listener;
118returnthis;
119}
120
121/**
122* Set the positive button text and it's listener
123* @param positiveButtonText
124* @param listener
125* @return
126*/
127publicBuilder setPositiveButton(String positiveButtonText,
128DialogInterface.OnClickListener listener) {
129this.positiveButtonText = positiveButtonText;
130this.positiveButtonClickListener = listener;
131returnthis;
132}
133
134/**
135* Set the negative button resource and it's listener
136* @param negativeButtonText
137* @param listener
138* @return
139*/
140publicBuilder setNegativeButton(intnegativeButtonText,
141DialogInterface.OnClickListener listener) {
142this.negativeButtonText = (String) context
143.getText(negativeButtonText);
144this.negativeButtonClickListener = listener;
145returnthis;
146}
147
148/**
149* Set the negative button text and it's listener
150* @param negativeButtonText
151* @param listener
152* @return
153*/
154publicBuilder setNegativeButton(String negativeButtonText,
155DialogInterface.OnClickListener listener) {
156this.negativeButtonText = negativeButtonText;
157this.negativeButtonClickListener = listener;
158returnthis;
159}
160
161/**
162* Create the custom dialog
163*/
164publicCustomDialog create() {
165LayoutInflater inflater = (LayoutInflater) context
166.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
167// instantiate the dialog with the custom Theme
168finalCustomDialog 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() {
182publicvoid 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() {
201publicvoid 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,
224newLayoutParams(
225LayoutParams.WRAP_CONTENT,
226LayoutParams.WRAP_CONTENT));
227}
228dialog.setContentView(layout);
229returndialog;
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) {
09caseCUSTOM_DIALOG :
10CustomDialog.Builder customBuilder =new
11CustomDialog.Builder(CustomDialogActivity.this);
12customBuilder.setTitle("Custom title")
13.setMessage("Custom body")
14.setNegativeButton("Cancel",
15newDialogInterface.OnClickListener() {
16publicvoid onClick(DialogInterface dialog,int which) {
17CustomDialogActivity.this
18.dismissDialog(CUSTOM_DIALOG);
19}
20})
21.setPositiveButton("Confirm",
22newDialogInterface.OnClickListener() {
23publicvoid onClick(DialogInterface dialog,int which) {
24dialog.dismiss();
25}
26});
27dialog = customBuilder.create();
28break;
29caseDEFAULT_DIALOG :
30AlertDialog.Builder alertBuilder =new
31AlertDialog.Builder(CustomDialogActivity.this);
32alertBuilder.setTitle("Default title")
33.setMessage("Default body")
34.setNegativeButton("Cancel",
35newDialogInterface.OnClickListener() {
36publicvoid onClick(DialogInterface dialog,int which) {
37dialog.dismiss();
38}
39})
40.setPositiveButton("Confirm",
41newDialogInterface.OnClickListener() {
42publicvoid onClick(DialogInterface dialog,int which) {
43CustomDialogActivity.this
44.dismissDialog(DEFAULT_DIALOG);
45}
46});
47dialog = alertBuilder.create();
48break;
49}
50returndialog;
0 0
原创粉丝点击