AlertDialog的用法

Posted sq19920518

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AlertDialog的用法相关的知识,希望对你有一定的参考价值。

一、AlertDialog的介绍

  一个对话框一般是一个出现在当前Activity之上的一个小窗口,处于下面的Activity失去焦点, 对话框接受所有的用户交互,对话框一般用于提示信息和与当前应用程序直接相关的小功能。

  Activities提供了一种方便管理的创建、保存、回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过getOwnerActivity()方法返回该Activity管理的对话框(dialog).

  onCreateDialog(int):当你使用这个回调函数时,android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流。

  showDialog(int): 当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。

  onPrepareDialog(int, Dialog):在对话框被显示之前,Android还调用了可选的回调函数onPrepareDialog(int id, Dialog). 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用。如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。

  dismissDialog(int):当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。

二、AlertDialog对话框的创建

  AlertDialog对话框主要包括:普通对话框、列表对话框、单选对话框和多选对话框。
  
  代码如下:

package com.danny_jiang.day10_dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
/**
 * 普通对话框、列表对话框、单选对话框、多选对话框
 * @author Administrator
 *
 */
public class MainActivity extends Activity 

    private int position = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

    /**
     * 所有的AlertDialog统统都是通过Builder去构建的
     */
    public void click(View view) 
        switch (view.getId()) 
        case R.id.alertDialog:
            // 初始化Builder对象
            AlertDialog.Builder builder1 = new AlertDialog.Builder(this);

            // 通过Builder设置对话框的title标题和message内容、以及图标
            builder1.setTitle("残忍卸载");
            builder1.setMessage("真的要卸载吗 T_T");
            builder1.setIcon(R.drawable.ic_launcher);

            // 设置为false说明当前dialog是不能用返回键取消的(默认为true)
            builder1.setCancelable(false);

            // 设置"坚持卸载"按钮
            builder1.setPositiveButton("坚持卸载", new OnClickListener() 

                /**
                 * 当点击对话框中某一item时,此方法被调用
                 * 
                 * @param which 是系统中确认按钮所对应的位置
                 */
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    Toast.makeText(MainActivity.this, "点击了卸载按钮 which is" + which, 
                            Toast.LENGTH_SHORT).show();
                
            );

            // 设置"取消卸载"按钮
            builder1.setNegativeButton("取消卸载", new OnClickListener() 

                //此时的which是取消按钮的位置,由系统决定
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    Toast.makeText(MainActivity.this, "点击了取消按钮 + which is " + which, 
                            Toast.LENGTH_SHORT).show();
                
            );

            // 设置"查看详情"按钮
            builder1.setNeutralButton("查看详情", new OnClickListener() 

                //此时的which是查看详情的位置,由系统决定
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    Toast.makeText(MainActivity.this, "点击了查看详情+ which is " + which, 
                            Toast.LENGTH_SHORT).show();
                
            );

            // 通过Builder.show方法显示对话框
            builder1.show();
            //AlertDialog dialog = builder1.create();
            //dialog.show();
            break;

        case R.id.listDialog:
            Builder builder2 = new Builder(this);

            builder2.setTitle("作诗一首");

            final String[] arr = getResources().getStringArray(R.array.poet);

            //通过setItems设置为列表对话框样式
            builder2.setItems(arr, new OnClickListener() 

                //此参数中的which是显示列表的item位置信息,从0开始
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    Toast.makeText(MainActivity.this, "您喜欢 " + arr[which], 
                            Toast.LENGTH_SHORT).show();
                
            );

            builder2.show();
            break;

        case R.id.singleDialog:
            Builder builder3 = new Builder(this);

            builder3.setTitle("作诗一首");
            final String[] arr2 = getResources().getStringArray(R.array.arr);
            /**
             * 通过Builder.setSingleChoiceItems方法设置单选对话框样式
             * 1参数  所需要显示的列表内容
             * 2参数  默认选中item的位置,从0开始。如果设置为-1,则无选中项
             * 3参数  item选中的监听器
             */
            builder3.setSingleChoiceItems(arr2, -1, new OnClickListener() 

                @Override
                public void onClick(DialogInterface dialog, int which) 
                    position = which;
                
            );

            builder3.setNegativeButton("Cancel", null);
            builder3.setPositiveButton("OK", new OnClickListener() 

                @Override
                public void onClick(DialogInterface dialog, int which) 
                    String content = arr2[position];
                    Toast.makeText(MainActivity.this, "点击了 " + content, 
                            Toast.LENGTH_SHORT).show();
                
            );

            builder3.show();
            break;

        case R.id.multiDialog:
            Builder builder4 = new Builder(this);

            builder4.setTitle("选中的兴趣爱好");
            final String[] arr3 = getResources().getStringArray(R.array.arr2);
            //创建boolean数组,长度跟字符串长度一致,保存有哪些item处于选中状态
            final boolean[] checkedPos = new boolean[arr3.length];
            final StringBuilder sBuilder = new StringBuilder();

            builder4.setMultiChoiceItems(arr3, null, new OnMultiChoiceClickListener() 

                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) 
                    android.util.Log.e("danny", "which is " + which + 
                            "isChecked is " + isChecked);
                    checkedPos[which] = isChecked;
                
            );
            builder4.setPositiveButton("OK", new OnClickListener() 

                @Override
                public void onClick(DialogInterface dialog, int which) 
                    for(int i = 0; i < checkedPos.length; i++) 
                        if(checkedPos[i]) 
                            sBuilder.append(arr3[i] + "\\n");
                        
                    

                    String content = sBuilder.toString();
                    Toast.makeText(MainActivity.this, content, 1000).show();
                
            );

            builder4.show();
            break;

        default:
            break;
        
    

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="$relativePackage.$activityClass" >

    <Button
        android:id="@+id/alertDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="普通对话框" />

    <Button
        android:id="@+id/listDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="列表对话框" />

    <Button
        android:id="@+id/singleDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="单选对话框" />

    <Button
        android:id="@+id/multiDialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="多选对话框" />

</LinearLayout>

strings.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Day10_Dialog</string>
    <string name="hello_world">Hello world!</string>

    <string-array name="poet">
        <item>床前明月光</item>
        <item>我爸是李刚</item>
        <item>不识庐山真面目</item>
        <item>只识弯弓射大雕</item>
    </string-array>
    <string-array name="arr">
        <item>十年生死两茫茫</item>
        <item>一树梨花压海棠</item>
        <item>天苍苍,野茫茫</item>
        <item>一树梨花压海棠</item>
    </string-array>
    <string-array name="arr2">
        <item>在天愿做比翼鸟</item>
        <item>大难临头各自飞</item>
        <item>老夫疗法少年狂</item>
        <item>青春作伴好还乡</item>
    </string-array>

</resources>

效果图如下:
普通对话框

列表对话框

单选对话框

多选对话框

三、自定义View的AlertDialog

  有时候系统自带的AlertDialog风格不能满足我们的需求,就比如说我们要实现一个Login画面,有用户名和密码,这时我们就要用到自定义View的AlertDialog

  1、先创建自定义登录框的布局文件my_login_view.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="账号:" />

        <EditText
            android:id="@+id/account"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密码:" />

        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="numberPassword" />
    </LinearLayout>

</LinearLayout>

  2、在Activity的合适地方创建自定义的AlertDialog(比如按钮的点击事件中):

package com.vince.login_dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

    public void click(View view) 
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        LayoutInflater inflater = LayoutInflater.from(this);
        final View myLoginView = inflater.inflate(R.layout.login_layout, null);

        builder.setView(myLoginView);
        builder.setTitle("用户登录");
        builder.setPositiveButton("确定", new OnClickListener() 

            @Override
            public void onClick(DialogInterface dialog, int which) 
                EditText account = (EditText) myLoginView
                        .findViewById(R.id.account);
                EditText password = (EditText) myLoginView
                        .findViewById(R.id.password);
                String acc = account.getText().toString();
                String pass = password.getText().toString();
                Toast.makeText(MainActivity.this, "账号:" + acc + " 密码:" + pass,
                        Toast.LENGTH_LONG).show();
            
        );

        builder.setNegativeButton("取消", new OnClickListener() 

            @Override
            public void onClick(DialogInterface dialog, int which) 

            
        );
        builder.show();
    

效果图如下:

四、自定义Adapter的AlertDialog

代码如下:

package com.vince.dialog_adapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity 

    // 数据源
    private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    private SimpleAdapter adapter;
    private AlertDialog dialog;// 对话框

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化适配器
        initAdapter();
    

    /**
     * 初始化适配器
     */
    private void initAdapter() 
        for (int i = 0; i < 10; i++) 
            Map<String,Object> map=new HashMap<String, Object>();
            map.put("name", "Android-"+i);
            map.put("count", i);
            list.add(map);
        
        adapter = new SimpleAdapter(this, list,android.R.layout.simple_list_item_2,
                new String[]"name","count",
                new int[]android.R.id.text1,android.R.id.text2);
    

    public void click(View view) 
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        dialog = builder.setTitle("自定义适配器").setIcon(R.drawable.ic_launcher)
                .setAdapter(adapter, new OnClickListener() 

                    public void onClick(DialogInterface dialog, int which) 
                        Toast.makeText(MainActivity.this,
                                "选中了" + list.get(which).get("name"),
                                Toast.LENGTH_LONG).show();
                    
                ).create();
        dialog.show();
    

效果图如下:

更多有关AlertDialog的介绍,见http://blog.csdn.net/ameyume/article/details/6138488
http://www.cnblogs.com/jiayongji/p/5371996.html

以上是关于AlertDialog的用法的主要内容,如果未能解决你的问题,请参考以下文章

AlertDialog的用法

安卓AlertDialog四种对话框的最科学编写用法

许地山-梨花

科学种植北美海棠苗的方法

AlertDialog(警告对话框)

宋词:一剪梅,雨打梨花深闭门。唐寅