Android培训
美国上市Android培训机构

400-111-8989

热门课程

Android Dialog详细介绍,Android Dialog 知识教程

  • 时间:2017-06-06
  • 发布:Android培训
  • 来源:Android教程

Android中对话框是非常常用的控件之一, google也提供了各种自定义对话框. 我觉得好多人都太模糊. 所以我全面的总结下.

对话框的几种实现方式:

  1. Activity

  2. Popwindow 这个我之前详细讲过可以去看. popwindow详解

  3. Dialog

  4. Fragment

Dialog这个类的使用方式是由Activity来管理和创建. 但是其使用方法已经被废弃. 所以现在一般直接使用其子类. (这一段我也不确定, 网上对于Dialog的讲解很少). 所以Dialog我不讲了.

关键类

  • AlertDialog

  • ProgressDialog

  • DialogFragment

  • Activity

[TOC]

示例

这里有个关键类: AlertDialog.Builder. 属于构造器模式用法.

这里演示最简单的对话框

Android Dialog

代码

1

2

3

4

AlertDialog.Builder builder =newAlertDialog.Builder(this);

builder.setTitle("标题");

builder.setMessage("信息");

builder.show();

方法介绍

上面介绍了最基本的AlertDialog的使用. 但是在开发中需要更复杂的功能实现. 所以我会介绍下所有的方法

Builder是属于AlertDialog的内部类. 负责创建AlertDiglog的构造器. 所以属于链式编程.

正因为是构造器模式, AlertDialog的所有方法你都可以直接忽略, Builder已经实现了所有的功能. 并且AlertDialog是Protected权限无法直接创建对象的.

确定和取消/中立按钮

Android Dialog

虽然叫做确定和取消按钮, 不过你设置成别的名称或者功能都可以.

1

2

3

4

5

6

7

8

9

10

11

12

13

builder.setPositiveButton("确定",newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterface dialog,intwhich){

// 点击事件的回调方法

}

});

builder.setNegativeButton("取消",newDialogInterface.OnClickListener() {

@Override

publicvoidonClick(DialogInterface dialog,intwhich){

}

});

左边按钮(取消)

1

2

3

4

5

AlertDialog.BuildersetPositiveButton(inttextId,  // 字符串数组资源id

DialogInterface.OnClickListener listener)

AlertDialog.BuildersetPositiveButton(CharSequence text,  // 字符串

DialogInterface.OnClickListener listener)

右边按钮(确定)

1

2

3

4

5

AlertDialog.BuildersetNegativeButton(CharSequence text,

DialogInterface.OnClickListener listener)

AlertDialog.BuildersetNegativeButton(inttextId,

DialogInterface.OnClickListener listener)

中立按钮(随便你写啥). 这个按钮位于取消和确定中间的一个.

1

2

3

4

5

AlertDialog.BuildersetNeutralButton(CharSequence text,

DialogInterface.OnClickListener listener)

AlertDialog.BuildersetNeutralButton(inttextId,

DialogInterface.OnClickListener listener)

传统选择对话框

注意所有的条目选择方法都不能和setMessage同时使用. 否则无效. 并且选中任何条目都将关闭对话框.

1

2

3

4

5

AlertDialog.BuildersetItems(intitemsId,

DialogInterface.OnClickListener listener)

AlertDialog.BuildersetItems(CharSequence[] items,

DialogInterface.OnClickListener listener)

MaterialDesign单选对话框

Android Dialog

该对话框和传统的单选对话框的区别是选中条目后可以不自动关闭对话框. 并且可以设置默认选中的条目.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

AlertDialog.BuildersetSingleChoiceItems(intitemsId, // 资源数组id

intcheckedItem,  // 选中状态的条目索引. 如果默认不选中任何, 写-1

DialogInterface.OnClickListener listener)

AlertDialog.BuildersetSingleChoiceItems(ListAdapter adapter, // 前面提过的适配器

intcheckedItem,

DialogInterface.OnClickListener listener)

AlertDialog.BuildersetSingleChoiceItems(Cursor cursor, // 前面提过的游标

intcheckedItem,

String labelColumn,

DialogInterface.OnClickListener listener)

AlertDialog.BuildersetSingleChoiceItems(CharSequence[] items, // 字符串数组

intcheckedItem,

DialogInterface.OnClickListener listener)

多选对话框

Android Dialog

1

2

3

4

5

6

7

8

9

10

11

12

AlertDialog.BuildersetMultiChoiceItems(CharSequence[] items, // 条目数组

boolean[] checkedItems,  // 选择状态数组 ,如果不想默认选中任何, 可写null

DialogInterface.OnMultiChoiceClickListener listener)

AlertDialog.BuildersetMultiChoiceItems(intitemsId,

boolean[] checkedItems,

DialogInterface.OnMultiChoiceClickListener listener)

AlertDialog.BuildersetMultiChoiceItems(Cursor cursor, // 采用游标的方式

String isCheckedColumn,

String labelColumn,

DialogInterface.OnMultiChoiceClickListener listener)

参数介绍:

  • items : 没什么好讲的. 条目的内容

  • checkedItems 这是一个布尔类型数组. 对应items的选择状态

  • listener 回调监听器

示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

finalString[] itemTitles = {"象拔蚌","鲍鱼","寿桃包"};

builder.setMultiChoiceItems(itemTitles,null,newDialogInterface.OnMultiChoiceClickListener() {

/**

* 在选中对话框条目的时候回调

*@paramdialog 对话框, 可用于在该回调方法内部调用dismiss关闭对话框

*@paramwhich 当前被选中的条目索引

*@paramisChecked 被选择状态

*/

@Override

publicvoidonClick(DialogInterface dialog,intwhich,booleanisChecked){

// 吐司

Toast.makeText(MainActivity.this, itemTitles[which], Toast.LENGTH_SHORT).show();

dialog.dismiss();// 关闭对话框

}

});

适配器创建对话框

相当于使用ListView的适配器ListAdapter来设置选择条目的显示内容. 可以显示更加丰富的内容.

1

2

AlertDialog.BuildersetAdapter(ListAdapter adapter,

DialogInterface.OnClickListener listener)

游标创建对话框

1

2

3

AlertDialog.BuildersetCursor(Cursor cursor,

DialogInterface.OnClickListener listener,

String labelColumn)

创建和显示

1

2

3

AlertDialogcreate()// 创建只是返回一个AlertDialog对象. 并不会显示该对话框

AlertDialogshow()// 直接显示对话框

得到上下文

得到创建AlertDialog时所传入的上下文对象.

1

ContextgetContext()

是否可取消

默认为true, 即点击对话框外部会关闭对话框. 如果false则不会关闭

1

AlertDialog.BuildersetCancelable(booleancancelable)

标题

1

2

3

AlertDialog.BuildersetTitle(CharSequence title)

AlertDialog.BuildersetTitle(inttitleId)

上面的方法标题只是文字的形式而已. 而下面的方法可以在标题的位置自定义任何view对象来显示.

1

AlertDialog.BuildersetCustomTitle(View customTitleView)

标题图标

即在标题的左边加上一个图片作为图标显示

Android Dialog

1

2

3

AlertDialog.BuildersetIcon(Drawable icon)

AlertDialog.BuildersetIcon(inticonId)

还有一个通过主题的属性来设置对话框图标. 我不懂

1

AlertDialog.BuildersetIconAttribute(intattrId)

自定义对话框显示

可以自定义对话框显示任何内容. 注意即使你自定义了对话框. 你使用设置确定和取消按钮

1

2

3

AlertDialog.BuildersetView(intlayoutResId)// 布局文件即可

AlertDialog.BuildersetView(View view)// View对象

监听器

取消监听器

取消监听器是点击对话框外部的方式关闭了对话框. 调用dismiss方法关闭的时候不会回调

1

AlertDialog.BuildersetOnCancelListener(DialogInterface.OnCancelListener onCancelListener)

关闭监听器

该监听器是在AlertDialog调用了dismiss()方法或者点击了对话框外部都会回调的监听器.

1

AlertDialog.BuildersetOnDismissListener(DialogInterface.OnDismissListener onDismissListener)

ListAdapter条目监听器

该方法是你将ListAdapter设为对话框条目显示的时候使用的方法

1

AlertDialog.Builder setOnItemSelectedListener (AdapterView.OnItemSelectedListener listener)

按键监听器

可以接受按键的事件. 可用于在弹出对话框后屏蔽按键.

1

AlertDialog.BuildersetOnKeyListener(DialogInterface.OnKeyListener onKeyListener)

进度对话框

除了以上的警示对话框的使用外. 还提供一种单独的对话框样式. 进度条对话框. 进度条是计算机应用历史上一个伟大的发明.

Android Dialog

1

2

3

4

ProgressDialog progressDialog =newProgressDialog(this);// 创建进度对话框对象

progressDialog.setTitle("标题");// 设置标题

progressDialog.setMessage("加载中...");// 设置消息

progressDialog.show();// 显示进度条

除了上面这种默认进度条样式, Google还提供设置样式水平进度条

Android Dialog

1

2

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

//ProgressDialog.STYLE_SPINNER 旋转进度条, 默认就是这种样式

方法介绍

ProgressDialog是AlertDialog的子类. 继承了其所有方法. 所以这里我只讲新增的方法.

进度设置

既然是进度对话框当然提供设置进度的方法, 默认的旋转进度条样式是无法设置进度的. 该方法必须在show()后面执行才生效.

1

2

3

intgetProgress()

voidsetProgress(intvalue)

最大进度

1

2

3

voidsetMax(intmax)

intgetMax()

显示

可以用父类的show()方法. 也可以用ProgressDialog新增的静态方法直接一行代码显示.类似于Toast的用法.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

ProgressDialogshow(Context context, // 上下文

CharSequence title,  // 标题

CharSequence message)// 消息内容

ProgressDialogshow(Context context,

CharSequence title,

CharSequence message,

booleanindeterminate)

ProgressDialogshow(Context context,

CharSequence title,

CharSequence message,

booleanindeterminate,

booleancancelable)

ProgressDialogshow(Context context,

CharSequence title,

CharSequence message,

booleanindeterminate,

booleancancelable,

DialogInterface.OnCancelListener cancelListener)

次要进度

类似于你看视频的时候的缓存进度条. 比主进度条的颜色浅一些.

Android Dialog

1

2

3

voidsetSecondaryProgress(intsecondaryProgress)

intgetSecondaryProgress()

增长进度

和setProgress的区别是该修改是在原有的进度基础上增加或者减少. 并且不需要在乎在show()方法之前还是之后.

1

2

3

voidincrementProgressBy(intdiff)

voidincrementSecondaryProgressBy(intdiff)

不确定状态进度条

该效果只针对水平进度条. 进度条的状态显示在不断地变化.

Android Dialog

1

2

3

4

5

voidsetIndeterminate(booleanindeterminate)// 默认为false. true开启效果

booleanisIndeterminate()// 是否处于不确定状态

voidsetIndeterminateDrawable(Drawable d)// 设置一个图片作为不确定进度的显示

进度样式

1

voidsetProgressStyle(intstyle)

包括两个参数:

  1. STYLE_HORIZONTAL 水平进度条

  2. STYLE_SPINNER 环形进度条

设置进度图片

该方法只有在ProgressDialog为水平样式时才有效.

1

voidsetProgressDrawable(Drawable d)

格式化

1

2

3

void setProgressNumberFormat (String format)

void setProgressPercentFormat (NumberFormat format)

ProgressBar

ProgressBar是作为控件使用的进度条. 且只能写在布局文件中使用. ProgressDialog的实现原理就是创建一个包含了ProgressDialog的View显示.

进度条对话框还可以在布局文件中直接写入作为控件, 同时该类只可以在布局中使用才会显示. 系统提供的水平进度样式. StyleProgressBar.Horizontal

1

2

3

4

5

6

7

8

<ProgressBar

style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"

android:progress="50"

android:max="100"

android:layout_gravity="center"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/

/>

Android Dialog

顺带一提, 进度条不能在子线程开启(show)但是可以在子线程关闭(dismiss).

DialogFragment

该类属于Fragment的子类, 也是官方推荐的对话框.

由于Dialog对象没有生命周期方法, 所以在横竖屏切换等会导致重建生命周期的情况出现时会丢失对话框.

如果没有以上要求建议还是Dialog对话框. 因为更加方便简单.

和一般的Fragment一样用法.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

publicclassCustomDialogFragmentextendsDialogFragment{

/**

* 和一般Fragment的onCreate方法一样

*

*@paraminflater

*@paramcontainer

*@paramsavedInstanceState

*@return返回View对象

*/

@Nullable

@Override

publicViewonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

returnsuper.onCreateView(inflater, container, savedInstanceState);

}

/**

* 用于在Fragment里面嵌套Dialog, 和上面的方法两选一实现即可.

* 如果两个都写了只有这个方法生效

*

*@paramsavedInstanceState

*@return返回Dialog对象

*/

@Override

publicDialogonCreateDialog(Bundle savedInstanceState){

returnsuper.onCreateDialog(savedInstanceState);

}

}

在Activity里面显示

1

newDialog().show(getSupportFragmentManager(),"bag");

声明周期方法

这里介绍的都是用于重写的周期回调方法. 注意DialogFragment是Fragment的子类. 包括Fragment的所有生命周期

关闭

当dismiss方法关闭对话框时回调该方法

1

voidonDismiss(DialogInterface dialog)

取消

点击DialogFragment外部取消对话框回调的方法

1

voidonCancel(DialogInterface dialog)

调用方法

用于调用的方法

显示对话框

  • 一般的用法显示DialogFragment, 会作为一般的Fragment嵌套在Activity中

  • 使用以下方法将把DialogFragment作为对话框弹窗显示

1

2

3

4

5

voidshow(FragmentManager manager,

String tag)// 标签. 这些参数其实只要会Fragment都能看懂.

intshow(FragmentTransaction transaction,

String tag)

关闭对话框

1

voiddismiss()

是否可取消

即点击对话框外部是否可以关闭对话框

1

2

voidsetCancelable(booleancancelable)

booleanisCancelable()

得到对话框对象

1

DialoggetDialog()// 得到onCreateDialog方法返回的Dialog对象

是否作为对话框显示

如果设为false则将和Fragment一样创建布局而不是对话框. 这个方法需要在onCreateDialog方法之前执行才有效. 推荐onCreate方法里面执行 . 不过如果你设为false, DialogFragment的show方法将无效.

该方法没啥卵用.

1

2

3

booleangetShowsDialog()

voidsetShowsDialog(booleanshowsDialog)// 默认为true

主题样式

必须在onCreateDialog方法执行前调用. 即onCreate方法里面调用.

1

2

voidsetStyle(intstyle, // 样式

inttheme)// 主题, 如果0则使用默认主题

style支持四种参数值:

  1. STYLE_NORMAL 普通

  2. STYLE_NO_FRAME 无边框

  3. STYLE_NO_INPUT 无法得到焦点. 将无法输入或者点击

  4. STYLE_NO_TITLE 无标题

得到DialogFragment的主题

对应得到setStyle()方法设置的主题.

1

int getTheme ()

取消状态丢失

详情看Fragment的commitAllowingStateLoss方法

1

void dismissAllowingStateLoss ()

Activity

Activity作为对话框. 只需要在主题中继承dialog的主题即可. 然后正常打开该activity即可.

示例

1

2

3

4

<stylename="CustomDialog"parent="@android:style/Theme.Dialog">

<itemname="android:windowBackground">@android:color/transparent</item>

<itemname="android:windowNoTitle">true</item>

</style>

这里我取消了标题栏和背景透明.

※ 注意activity的根布局千万不要设置为match_parent全屏显示.

总结

特点介绍:

  • Dialog 这类的实现google官方不推荐因为没有生命周期. 如果意外销毁会导致数据的丢失. 不过使用简单. 如果没什么特别的要求就用这个吧

  • DialogFragment 可以算的上是最佳实现. 如果对话框界面相对复杂的话可以用这个.

  • Activity 自带渐变的过渡动画, 懒得写过渡动画就用这个吧.

  • popwindow 可以附着到其他控件周围.

我写的不咋地. 有问题直说吧

上一篇:Android开发搭建应用框架步骤和注意的问题
下一篇:推荐给Android开发人员实用的十个开发工具

Android广播那些事—开发者必要了解的面试技巧

Android 手机 全面屏(18:9屏幕)适配指南

Android 支付宝支付开发流程

你可以不懂产品,但是不能忽略设计!Android篇

选择城市和中心
贵州省

广西省

海南省