Android AlertDialog笔记

栏目: IOS · Android · 发布时间: 7年前

内容简介:弹出框,用于提示用户和进行简单交互,可以提供最多三个按钮,标题(虽然现在有几个人用的app都会自定义这种弹出提示的UI,一般不会用android原生的控件,但我还是用的很多的(UI?不存在的,只能用MD凑合凑合这样子)。

官方文档

弹出框,用于提示用户和进行简单交互,可以提供最多三个按钮,标题( title )和提示信息( message )可以通过方法直接设置,如果需要呈现复杂布局,也可以自定义布局并设置。

虽然现在有几个人用的app都会自定义这种弹出提示的UI,一般不会用android原生的控件,但我还是用的很多的(UI?不存在的,只能用MD凑合凑合这样子)。

这篇笔记主要集中在一般用法和可能会踩到的坑的解决办法,不会讨论代码原理啥的。

基本使用

通常使用builder来构建一个AlertDialog:

AlertDialog.Builder(this)
	.setTitle("Notice")
	.setMessage("Some Message")
	.setPositiveButton("OK") { _, _ -> // do sth }
	.create().show()
复制代码

最简单的dialog,显示一些信息,点击ok隐藏。

Android AlertDialog笔记

注意,在 .setPositiveButton("OK") { _, _ -> // do sth } 监听方法中, dialog.dismiss() 是自动调用的,所以不用写, NegativeButtonNeutralButton 也一样。

自定义View

有时需要在dialog中显示输入框,提示让用户输入一些信息,在点击ok时处理输入信息。 先自定义一个布局 layout_dialog_report.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/et_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:inputType="text"/>
</LinearLayout>
复制代码

在dialog中使用:

// 获取view
val inputView = LayoutInflater.from(this).inflate(R.layout.layout_dialog_report, null)
val nameInputDialog = AlertDialog.Builder(this)
        .setTitle("请输入")
        .setView(inputView) // 设置显示的view
        .setPositiveButton("OK") { _, _ -> }
        .setNegativeButton("Cancel") { _, _ ->  }
        .create()
// 因为后面要通过dialog获取button,此时要单独获取dialog对象,然后手动show()
nameInputDialog.show()
// 获取button并设置点击事件
nameInputDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener {
    PreferenceUtil.saveNickname(inputView.et_report.text.toString())
    nameInputDialog.dismiss()
    checkJob()
}
复制代码
Android AlertDialog笔记

注意:这里的坑就是必须使用 nameInputDialog.getButton() 方法获取到button之后单独设置点击事件,使用 .setPositiveButton("OK") { _, _ -> } 方法不起作用。

除了用 setTitle()setIcon() 设置标题和icon之外,还可以用 setCustomTitle (View customTitleView) 方法自定义标题样式。

选择一项的dialog

列出一组可供选择的选项,主要使用 setItems() 方法,该方法可以接受资源文件中的一组 array ,或一个 CharSequence 数组。

val jobList = arrayOf("Python", "Java", "JavaScript", "Kotlin", "C++")
AlertDialog.Builder(this)
	.setTitle("Notice")
	.setItems(jobList){ dialog, which ->
	    val selesctItem = jobList[which]
	    // do sth
	}
	.create().show()
复制代码
Android AlertDialog笔记
和一般按钮一样,这些选项也是点击之后会自动调用 dismiss()

方法隐藏。

多选项的dialog

可供多选的列表,需要提供一组数据,同时提供一个boolean值数组,设置的监听器将监听到多选的操作变化,手动将多选的结果将保存在这个数组中。

// 可供选择的list,或一组array资源
val dbList = arrayOf("Python", "Java", "JavaScript", "Kotlin", "C++")
// 保存选择结果的list,一般在传入时
val chooseList =  arrayOf(false,false,false,false).toBooleanArray()
AlertDialog.Builder(activity)
        .setTitle("Notice")
        .setMultiChoiceItems(dbList, chooseList){ _, which, isChecked ->
            chooseList[which] = isChecked
        }
        .setPositiveButton("OK") { _, _ ->
            for (i in chooseList.indices) {
                if (chooseList[i]) {
                    // do sth
                }
            }
        }
        .create().show()
复制代码

文档中还提供了以cursor为参数的设置方法:

public AlertDialog.Builder setMultiChoiceItems (Cursor cursor, 
                String isCheckedColumn, 
                String labelColumn, 
                DialogInterface.OnMultiChoiceClickListener listener)
复制代码
Android AlertDialog笔记

单选项的dialog

这个单选与上面的单选区别在于上面那个是点击之后即时反应的,而这一种是类似多选项,选中之后还可以更改,点击按钮确定之后才会处理。具体可以看效果图。 类似于多选项的设置方式,提供array资源或者一组字符串,也可以使用cursor,并且多了一个使用 ListAdapter 的方法,第二个参数是默认选中的item index,设置为-1则表示没有默认选中的。

val items = arrayOf("同时转发到QQ","同时转发到微信","同时转发到微博");
AlertDialog.Builder(this)
    .setSingleChoiceItems(items, 1) { _, which ->
         val item = items[which]
         // do sth
     }
     .setPositiveButton("OK") { _, _ ->
	     // do sth
     }
    .create().show()
复制代码
Android AlertDialog笔记

在dialog上显示dialog

有时点击确定之后,需要在这一层上再弹出一层dialog作为二次提示或者警告,但一般确认按钮都会自动调用 dismiss() 使dialog消失。这里有两个解决办法,一是通过反射把底层dialog的状态设置为不显示,这样 dismiss() 方法就不起作用,在上层选择完之后,再手动选择是否隐藏底层dialog。原理是 dismiss() 方法会先判断 "mShowing" 这个属性然后再隐藏dialog。 一个两层dialog的例子:

AlertDialog.Builder(this)
	.setTitle("Notice")
	.setItems(jobList){ out, which ->
	     val field = out?.javaClass?.superclass?.getDeclaredField(
	                     "mShowing")
	     field?.isAccessible = true
	     //   将mShowing变量设为false,表示对话框已关闭
	     field?.set(out, false)
	     AlertDialog.Builder(this)
	             .setTitle(jobList[which])
	             .setMessage(PreferenceUtil.getDescForJob(jobList[which]))
	             .setPositiveButton("OK") { inner, _ ->
	                 PreferenceUtil.setJob(jobList[which])
	                 EventUtil.onEvent(this, chooseJob, jobList[which])
	                 inner.dismiss()
	                 field?.set(out, true)
	                 out.dismiss()
	             }
	             .setNegativeButton("Cancel") { dialog, _ -> dialog.dismiss() }
	             .create().show()
	 }
	 .create().show()
复制代码

第二种方法就是前面说的自定义View作为dialog的内容,则点击按钮不会自动调用 dismiss() ,也就不会自动消失了。

Android AlertDialog笔记

以上所述就是小编给大家介绍的《Android AlertDialog笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Kotlin实战

Kotlin实战

【美】Dmitry Jemerov(德米特里·詹莫瑞福)、【美】 Svetlana Isakova(斯维特拉娜·伊凡诺沃) / 覃宇、罗丽、李思阳、蒋扬海 / 电子工业出版社 / 2017-8 / 89.00

《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 ......一起来看看 《Kotlin实战》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具