Android对话框

Android提供了丰富的对话框支持,主要有以下四种常用的:

ProgressDialog:进度条对话框
DatePickerDialog:日期选择对话框
TimePickerDialog:时间选择对话框
AlertDialog:功能最丰富
前三种是对Progress、DatePicker和TimePicker的简单封装,重点是AlertDialog的使用
1、ProgressDialog
1.1 可以直接使用

ProgressDialog.show(this, "Title", "Content", false, true);

动态显示环形进度条对话框,第二个参数为标题,第三个参数为内容,第四个参数为是否为无进度的进度条,第五个参数是否能够取消
1.2 使用对象,调用ProgressDialog的方法

ProgressDialog pd = new ProgressDialog(MainActivity.this);
// 设置对话框的标题
pd.setTitle("Title");
// 设置对话框显示的内容
pd.setMessage("Message");
// 设置对话框能用“取消”按钮关闭
pd.setCancelable(true);
// 设置对话框的进度条风格
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否为无进度
pd.setIndeterminate(true);
pd.show();

对于setIndeterminate为false的进度条,还能使用方法setMax设置进度的最大值,使用方法setProgress设置当前进度。dismiss()方法用来关闭进度条对话框。
2、DatePickerDialog

Calendar c = Calendar.getInstance();
// 直接创建一个DatePickerDialog对话框实例,并将它显示出来
new DatePickerDialog(MainActivity.this,
    // 绑定监听器
    new DatePickerDialog.OnDateSetListener()
    {
        @Override
        public void onDateSet(DatePicker dp, int year,
            int month, int dayOfMonth)
        {
            // year,month,dayOfMonth就是设置的日期
        }
    }
    //设置初始日期
    , c.get(Calendar.YEAR)
    , c.get(Calendar.MONTH)
    , c.get(Calendar.DAY_OF_MONTH)).show();

3、TimePickerDialog

Calendar c = Calendar.getInstance();
// 创建一个TimePickerDialog实例,并把它显示出来
new TimePickerDialog(MainActivity.this,
    // 绑定监听器
    new TimePickerDialog.OnTimeSetListener()
    {
        @Override
        public void onTimeSet(TimePicker tp, int hourOfDay,
            int minute)
        {
            // hourOfDay,minute分别为设置的时和分
        }
    }
    //设置初始时间
    , c.get(Calendar.HOUR_OF_DAY)
    , c.get(Calendar.MINUTE)
    //true表示采用24小时制
    , true).show();

4、AlertDialog重点学习的Dialog
使用AlertDialog创建对话框大致按如下步骤进行:
1创建AlertDialog.Builder对象,该对象是AlertDialog的创建器
2调用该对象的方法为对话框设置图标,标题,内容等
3调用该对象的created()方法创建AlertDialog对话框
4调用该对象的show()方法显示对话框
4.1提示消息对话框

AlertDialog.Builder builder = new AlertDialog.Builder(this)
    // 设置对话框标题
    .setTitle("Title")
    // 设置图标
    .setIcon(R.drawable.ic_launcher)
    .setMessage("Line1Message\nLine2Message");
    builder.setPositiveButton("确定", new OnClickListener()
        {
            public void onClick(DialogInterface dialog, int which)
            {
                // 点击按钮事件
            }
        });
    builder.setNegativeButton("取消", new OnClickListener()
    {
        public void onClick(DialogInterface dialog, int which)
        {
            // 点击按钮事件
        }
    });
    builder.create();
    builder.show();

效果如下图18-4-1所示:


图 18-4-1


4.2列表对话框
方法为builder.setItems()
为了代码简洁,这里没有添加按钮,按钮效果和4.1一样

AlertDialog.Builder builder = new AlertDialog.Builder(this)
    // 设置对话框标题
    .setTitle("Title")
    // 设置图标
    .setIcon(R.drawable.tools)
    // 设置简单的列表项内容
    .setItems(items, new OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int which)
        {
            // which为items资源的下标,点击相应的item会得到对应的which值
            // 然后处理点击给item的事件
        }
    });

    builder.create();
    builder.show();

R.drawable.tools为drawable目录下的名为tools的图片,items为定义好的字符串数组,有四个item

String[] items = new String[] {
        "aaaaa", "bbbbb",
        "ccccc", "ddddd" };

显示效果如下图18-4-2所示:


图 18-4-2


4.3单选列表对话框
builder方法为setSingleChoiceItems(),其余和列表对话框一样

AlertDialog.Builder builder = new AlertDialog.Builder(this)
        // 设置对话框标题
        .setTitle("单选列表项对话框")
        // 设置图标
        .setIcon(R.drawable.ic_launcher)
        // 设置单选列表项,默认选中第二项(索引为1)
        .setSingleChoiceItems(items, 1, new OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                // 处理点击item事件,which指明点击了哪个item
            }
        });
builder.create();
builder.show();

显示效果如图18-4-3所示:


图 18-4-3


4.4对选列表对话框
builder方法为setMultiChoiceItems()

AlertDialog.Builder builder = new AlertDialog.Builder(this)
        // 设置对话框标题
        .setTitle("多选列表项对话框")
        // 设置图标
        .setIcon(R.drawable.ic_launcher);
        // 设置多选列表项,设置勾选第2项、第4项
        boolean[] checkStatus = new boolean[] {false , true ,false ,true};
        builder.setMultiChoiceItems(items,  checkStatus, new OnMultiChoiceClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        // TODO Auto-generated method stub
                        // 根据checkStatus的boolean确定哪些选项被选中,即checkStatus[i]为true,则第i+1(下标i)个被选中
                    }

                });
builder.create();
builder.show();

效果如下图18-4-4所示:


图 18-4-4


4.5自定义列表对话框,这里用一个ArrayAdapter作为适配器,将items作为数据源显示成一个列表,使用setAdapter()方法载入一个自定义的列表

AlertDialog.Builder builder = new AlertDialog.Builder(this)
        // 设置对话框标题
        .setTitle("自定义列表项对话框")
                // 设置图标
        .setIcon(R.drawable.ic_launcher)
                // 设置自定义列表项
        .setAdapter(new ArrayAdapter<String>(this
                , R.layout.array_item
                , items), null);
        builder.create();
        builder.show();

ArrayAdapter设置每个item的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TextView"
    android:textColor="#f0f"
    android:textSize="30dp"
    android:shadowColor="#ff0"
    android:shadowRadius="2"
    android:shadowDx="5"
    android:shadowDy="5"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" />

效果如下图18-4-5所示:


图 18-4-5


4.6自定义对话框
通过setView设置为自定义的View

// 载入login.xml界面布局文件
TableLayout loginForm = (TableLayout)getLayoutInflater()
        .inflate( R.layout.login, null);
new AlertDialog.Builder(this)
        // 设置对话框的图标
        .setIcon(R.drawable.ic_launcher)
        // 设置对话框的标题
        .setTitle("自定义View对话框")
        // 设置对话框显示的View对象
        .setView(loginForm)
        .create()
        .show();

这里的View是login已经设置好的登录页面,login.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/loginForm"
             android:layout_width="match_parent"
             android:layout_height="match_parent">
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="用户名:"
            android:textSize="10pt"/>
        <!-- 输入用户名的文本框 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请填写登录账号"
            android:selectAllOnFocus="true"/>
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="密码:"
            android:textSize="10pt"/>
        <!-- 输入密码的文本框 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请填写密码"
            android:password="true"/>
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="电话号码:"
            android:textSize="10pt"/>
        <!-- 输入电话号码的文本框 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请填写您的电话号码"
            android:selectAllOnFocus="true"
            android:phoneNumber="true"/>
    </TableRow>
</TableLayout>

这里只是为了说明是自定义的View,添加了一个类似登录页面的TableLayout,这个地方可以任意已经定义好的布局
显示效果如下图18-4-6所示:


图 18-4-6


5、对话风格的窗口
本质上依然是窗口,只是把Activity的风格设为对话框的形式,在AndroidManiFest.xml文件中指定窗口以对话框风格显示:

android:theme="@android:style/Theme.Dialog"
posted @ 2016-04-07 11:26  Alter  阅读(358)  评论(0编辑  收藏  举报