Android UI系列—–Dialog对话框 (转自博客园)

Android 做棵大树 来源:博客园 6年前 (2018-04-15) 2326次浏览 0个评论

Android开发当中,在界面上弹出一个 Dialog 对话框使我们经常需要做的,本篇随笔将详细的讲解 Dialog 对话框这个概念,包括定义不同样式的对话框。

一、Dialog

我们首先来看看 android 官方文档对 Dialog 的介绍

A dialog is a small window that prompts the user to make a decision or enter additional information. A dialog does not fill the screen and is normally used for modal events that require users to take an action before they can proceed.

dialog 就是一个在屏幕上弹出一个可以让用户做出一个选择,或者输入额外的信息的对话框,一个对话框并不会沾满我们整个的屏幕,并且通常用于模型事件当中需要用户做出一个决定后才会继续执行。

Dialog 类是 dialog 对话框的基类,但是我们应该避免直接使用这个类来实例化一个 dialog 对话框,我们应当使用其子类来得到一个对话框:

java.lang.Object
   ↳     android.app.Dialog

Known Direct Subclasses
AlertDialog, CharacterPickerDialog, MediaRouteChooserDialog, MediaRouteControllerDialog, Presentation

Known Indirect Subclasses
DatePickerDialog, ProgressDialog, TimePickerDialog

我们看到,Dialog 有很多的子类实现,所以我们要定义一个对话框,使用其子类来实例化一个即可,而不要直接使用 Dialog 这个父类来构造。

二、AlertDialog

今天我们重点要来了解的就是 AlertDialog 对话框,我们看到,AlertDialog 是 Dialog 的一个直接子类。

使用 AlertDialog,我们可以显示一个标题,最多 3 个按钮操作,以及一组选择框或者是自己定义的弹出框。

这里借用 android 的官方文档提供的一个图来看看 AlertDialog 框的组成:

Android UI 系列-----Dialog 对话框 (转自博客园)

①区域 1 那里就是定义弹出框的头部信息,包括标题名或者是一个图标。

②区域 2 那里是 AlertDialog 对话框的 content 部分,在这里我们可以设置一些 message 信息,或者是定义一组选择框,还可以定义我们自己的布局弹出框。

③区域 3 那里使我们的 Action Buttons 部分,这里我们可以定义我们的操作按钮。

说到 Action Buttons 这里要特别注意一下:

在 AlertDialog 中,定义按钮都是通过 setXXXButton 方法来完成,其中一共有 3 种不同的 Action Buttons 供我们选择:

1.setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
这是一个相当于 OK、确定操作的按钮,

2.setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
这是一个相当于取消操作的按钮。

3. setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
这个是相当于一个忽略操作的按钮。

我们每一种 action buttons 最多只能出现一个,即弹出对话框最多只能出现一个 PositiveButton。

接下来我们通过一个一个的具体实例来看看我们常用的几种 AlertDialog 对话框。

1.弹出一个警告框,并有三个按钮可选择

Android UI 系列-----Dialog 对话框 (转自博客园)

我们来看看代码部分:

button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //    通过 AlertDialog.Builder 这个类来实例化我们的一个 AlertDialog 的对象
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                //    设置 Title 的图标
                builder.setIcon(R.drawable.ic_launcher);
                //    设置 Title 的内容
                builder.setTitle("弹出警告框");
                //    设置 Content 来显示一个信息
                builder.setMessage("确定删除吗?");
                //    设置一个 PositiveButton
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "positive: " + which, Toast.LENGTH_SHORT).show();
                    }
                });
                //    设置一个 NegativeButton
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "negative: " + which, Toast.LENGTH_SHORT).show();
                    }
                });
                //    设置一个 NeutralButton
                builder.setNeutralButton("忽略", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "neutral: " + which, Toast.LENGTH_SHORT).show();
                    }
                });
                //    显示出该对话框
                builder.show();
            }
        });

我们如果要创建一个 AlertDialog 对话框,需要使用 AlertDialog 的一个内部类,即 AlertDialog.Builder 来构建一个 AlertDialog 的对话框,然后通过 setXX 方法来设置我们想要显示的内容即可。

我们看到,我们一共设置了 3 个 action buttons,每一个 button 都为其绑定了一个 DialogInterface.OnClickListener() 的监听事件,然后在里面通过 Toast 吐司对话框(这个在后面随笔中会讲解)来弹出一下我们的一些信息,which 方法表示的是 action button 所代表的 int 值:

positive:  -1
negative:  -2
neutral:  -3

我们可以知道,which=-1 就表示点击的是确定按钮,-2 表示点击的是取消按钮,-3 表示点击的是忽略按钮。

2.下拉列表弹出框

Android UI 系列-----Dialog 对话框 (转自博客园)

关键代码如下:

button2.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("选择一个城市");
                //    指定下拉列表的显示数据
                final String[] cities = {"广州", "上海", "北京", "香港", "澳门"};
                //    设置一个下拉的列表选择项
                builder.setItems(cities, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "选择的城市为:" + cities[which], Toast.LENGTH_SHORT).show();
                    }
                });
                builder.show();
            }
        });

在这里我们通过 setItems(CharSequence[] items, DialogInterface.OnClickListener listener) 方法来设置我们的一个下拉列表框。注意:因为下拉列表框或者是下拉多选框这些都是显示在 Content 中的,所以 message 和下拉列表框这些是不能够同时存在的

我们也可以给其绑定一个 DialogInterface.OnClickListener 监听器,当选中一个选项时,对话框就会消失掉。这里的 which 代表的是下拉列表的每个选项的索引,通过这个我们可以轻松得到用户选中的是哪一个选项。

Android UI 系列-----Dialog 对话框 (转自博客园)

3.弹出一个下拉单选框

Android UI 系列-----Dialog 对话框 (转自博客园)

button3.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("请选择性别");
                final String[] sex = {"男", "女", "未知性别"};
                //    设置一个单项选择下拉框
                /**
                 * 第一个参数指定我们要显示的一组下拉单选框的数据集合
                 * 第二个参数代表索引,指定默认哪一个单选框被勾选上,1 表示默认'女' 会被勾选上
                 * 第三个参数给每一个单选项绑定一个监听器
                 */
                builder.setSingleChoiceItems(sex, 1, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Toast.makeText(MainActivity.this, "性别为:" + sex[which], Toast.LENGTH_SHORT).show();
                    }
                });
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.show();
            }
        });

注意在弹出下拉单选框时,当我们选中一个选项,对话框是不会消失的,我们需要点击 action button 才能让对话框消失

 

Android UI 系列-----Dialog 对话框 (转自博客园)

4.弹出一个下拉多选框

Android UI 系列-----Dialog 对话框 (转自博客园)

 

button4.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("爱好");
                final String[] hobbies = {"篮球", "足球", "网球", "斯诺克"};
                //    设置一个单项选择下拉框
                /**
                 * 第一个参数指定我们要显示的一组下拉多选框的数据集合
                 * 第二个参数代表哪几个选项被选择,如果是 null,则表示一个都不选择,如果希望指定哪一个多选选项框被选择,
                 * 需要传递一个 boolean[]数组进去,其长度要和第一个参数的长度相同,例如 {true, false, false, true};
                 * 第三个参数给每一个多选项绑定一个监听器
                 */
                builder.setMultiChoiceItems(hobbies, null, new DialogInterface.OnMultiChoiceClickListener()
                {
                    StringBuffer sb = new StringBuffer(100);
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked)
                    {
                        if(isChecked)
                        {
                            sb.append(hobbies[which] + ", ");
                        }
                        Toast.makeText(MainActivity.this, "爱好为:" + sb.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.show();
            }
        });

我们看到在设置下拉多选框时使用的是 setMultiChoiceItems 方法,其各个参数的含义,在上面代码中已经阐述了。
同样,对于下拉多选框,当我们选中其中一个选项时,对话框是不会消失的,只有点击了 action button 才会消失

Android UI 系列-----Dialog 对话框 (转自博客园)

5.自定义弹出对话框

对于自定义弹出对话框,我们就需要自己指定一个自定义的布局文件了,我们就给出一个最简单的输入用户名和密码的两个 EditText:

dialog.xml

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

<EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="username"/>

<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/username"
android:hint="password"
android:inputType="textPassword"/>

</RelativeLayout>

Android UI 系列-----Dialog 对话框 (转自博客园)

button5.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.ic_launcher);
                builder.setTitle("请输入用户名和密码");
                //    通过 LayoutInflater 来加载一个 xml 的布局文件作为一个 View 对象
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null);
                //    设置我们自己定义的布局文件作为弹出框的 Content
                builder.setView(view);
                
                final EditText username = (EditText)view.findViewById(R.id.username);
                final EditText password = (EditText)view.findViewById(R.id.password);
                
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        String a = username.getText().toString().trim();
                        String b = password.getText().toString().trim();
                        //    将输入的用户名和密码打印出来
                        Toast.makeText(MainActivity.this, "用户名: " + a + ", 密码: " + b, Toast.LENGTH_SHORT).show();
                    } 
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        
                    }
                });
                builder.show();
            }
        });

我们看到,通过自定义弹出框,我们首先需要写一个 xml 的布局文件,然后在里面定义我们的布局,我们不需要在布局文件里定义 Button 按钮,可以通过 AlertDialog.Builder 来设置 action buttons。

通过 View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null); 我们可以将我们的布局文件加载进来,得到一个 View 对象,然后通过 AlertDialog.Builder 的 setView 方法来设置我们的自定义弹出框Android UI 系列-----Dialog 对话框 (转自博客园)

总结:到这里,基本上将 AlertDialog 详细的讲解完了,本篇随笔主要讲解了 Dialog 弹出框的基本概念以及详细讲解了 AlertDialog 这个弹出框,包括定义一个基本的弹出警告框、下拉列表框、下拉多选框等等。后续的随笔将会继续记录学习Android的点点滴滴。


做棵大树 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Android UI 系列—–Dialog 对话框 (转自博客园)
喜欢 (12)
[欢迎投币]
分享 (0)
关于作者:
一个整天无所事事的,有时候忽然热血的孩子
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址