Android对话框Dialog

    |     2015年7月2日   |   Android UI界面   |     0 条评论   |    1960

对话框顾名思义即人与应用系统对话交互的窗口:登录时检查用户信息可以用对话框提示,退出应用时也可以弹出退出确认。只要涉及到交互的地方都可以使用对话框。

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

  • 警告对话框 AlertDialog:可以有 0 到 3 个按钮,一个单选框或复选框列表。能创建大多数交互界面,是推荐的类型。
  • 进度对话框 ProgressDialog:显示进度环或进度条。它是 AlertDialog 的扩展,所以也支持按钮。
  • 日期选择对话框 DatePickerDialog:让用户选择一个日期。
  • 时间选择对话框 TimePickerDialog:让用户选择一个时间。

如果希望自定义对话框,可以扩展 Dialog 类。下面一起看常用对话框以及实现方式。


一、常用对话框结构图

QQ╜╪═╝20150702145915

1、常用确认对话框  2、日期对话框

QQ╜╪═╝20150702145225 QQ╜╪═╝20150702150531

3、单选对话框  4、多选对话框

QQ╜╪═╝20150702150553 QQ╜╪═╝20150702150603

5、自定义对话框

QQ╜╪═╝20150702150543


二、对话框实现方式

1. 首先实例化对话框,设置相关属性。如:

ProgressDialog mProgressDialog = new ProgressDialog(this);

mProgressDialog.setMessage("信息下载加载中....");

mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

2. 调用 show 方法显示。

 mProgressDialog.show();

3. 调用 dismiss 方法隐藏。

  mProgressDialog.dismiss();

三、AlertDialog 实例化与按钮

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

     builder.setTitle("操作提示");

     builder.setMessage("是否退出?");

     //设置按钮事件

     builder.setNegativeButton("取消",

         new DialogInterface.OnClickListener() {

          @Override

          public void onClick(DialogInterface dialog, int which) {

            Toast.makeText(DialogAcitivity.this, "取消",

                Toast.LENGTH_SHORT).show();

          }

     });

     //创建对话框

     AlertDialog dialog = builder.create();

android 中 setPositiveButton、setNegativeButton 和 setNeutralButton 的区别是什么?

在对话框中出现的位置不同:setPositiveButton 出现在最右,一般把功能设为「确定」;setNegativeButton 出现在最左,一般设为「取消」,也就是调用 dismiss();setNeutralButton 如果设置则出现在中间。

系统对话框一般由三部分组成:标题区域、内容区域、按钮事件处理区域。


四、自定义对话框

QQ╜╪═╝20150702150543

1. 定义一个类继承 AlertDialog:

 public class MyWeixinDialog extends AlertDialog {

  private Activity mContext;

  public MyWeixinDialog(Activity context) {

    super(context);

    mContext = context;

  }

  @Override

  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.exit_dialog);

    Button confirm = (Button) findViewById(R.id.exitBtn0);

    Button cancel = (Button) findViewById(R.id.exitBtn1);

    confirm.setOnClickListener(new View.OnClickListener() {

     @Override

     public void onClick(View v) {

       mContext.finish();

     }

    });

    cancel.setOnClickListener(new View.OnClickListener() {

     @Override

     public void onClick(View v) {

       dismiss();

     }

    });

  }

}

对应布局 XML:

<?xml version="1.0" encoding="UTF-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/exit_layout"

    android:layout_width="280dp"

    android:layout_height="wrap_content"

    android:background="@drawable/confirm_dialog_bg2"

    android:gravity="center_horizontal"

    android:layout_gravity="center_horizontal"

    android:orientation="vertical" >

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginTop="4dp"

        android:padding="5dp"

        android:text="退出微信"

        android:textColor="#333"

        android:textSize="20sp" />

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginTop="1dp"

        android:gravity="center_horizontal"

        android:padding="10dp"

        android:text="退出后,你将收不到新的消\n息.确定要退出?"

        android:textColor="#333"

        android:textSize="16sp" />

    <LinearLayout

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginBottom="8dp"

        android:layout_marginTop="33dp" >

        <Button

            android:id="@+id/exitBtn0"

            android:layout_width="110dp"

            android:layout_height="wrap_content"

            android:background="@drawable/btn_style_green"

            android:gravity="center"

            android:onClick="exitbutton0"

            android:text="是"

            android:textColor="#fff"

            android:textSize="16sp" />

        <Button

            android:id="@+id/exitBtn1"

            android:layout_width="110dp"

            android:layout_height="wrap_content"

            android:layout_marginLeft="10dp"

            android:background="@drawable/btn_style_white"

            android:gravity="center"

            android:onClick="exitbutton1"

            android:text="否"

            android:textColor="#333"

            android:textSize="16sp" />

    </LinearLayout>

</LinearLayout>

2. 实例化

 Dialog weixinDialog = new MyWeixinDialog(this);

3. 显示

  weixinDialog.show();

五、对话框与 Activity 绑定

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

  • onCreateDialog(int):Android 会把这个 Activity 设为每个对话框的所有者,自动管理状态并挂靠到 Activity。对话框打开时,菜单键显示该 Activity 的选项菜单,音量键修改 Activity 使用的音频流。
  • showDialog(int):想显示对话框时调用并传递唯一整数 ID。第一次被请求时,系统调用 onCreateDialog(int id),应在这里初始化 Dialog 并返回。
  • onPrepareDialog(int, Dialog):显示前还会调用这个可选回调。想在每次打开时改属性就定义它。它每次打开都调用,而 onCreateDialog 仅第一次打开时调用。不定义则对话框保持和上次打开时一样。
  • dismissDialog(int):关闭时可以对对话框调用 dismiss(),也可以从 Activity 调 dismissDialog(int id)。用 onCreateDialog 管理状态时,每次消除后对象状态由 Activity 保留;不再需要就调用 removeDialog(int id),删除内部引用,若正在显示也会被消除。

在 Activity 中调用 showDialog(1) 时系统会自动调用 onCreateDialog 创建 Dialog,只需在其中返回 Dialog:

 showDialog(1);
@Override

  protected Dialog onCreateDialog(int id) {

      switch(id){

      case 1:

        return new DatePickerDialog();

      }

  }

六、更优实现:DialogFragment

 /**

 * 调用方法:

 * MyAlertDialogFragment dialogFragment = new MyAlertDialogFragment();

 * dialogFragment.show(getFragmentManager(), "dialog");

 *

 */

public class MyAlertDialogFragment extends DialogFragment {

	@Override

	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

	}

	//法二

	 @Override

     public View onCreateView(LayoutInflater inflater, ViewGroup container,

            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.article_view, container, false);

        View tv = v.findViewById(R.id.article);

        ((TextView)tv).setText(mTitle);

        return v;

    }

	// 法一

	@Override

	public Dialog onCreateDialog(Bundle savedInstanceState) {

		return new AlertDialog.Builder(getActivity())

				.setIcon(android.R.drawable.ic_dialog_alert)

				.setTitle("提示框")

				.setPositiveButton(android.R.string.ok,

						new DialogInterface.OnClickListener() {

							public void onClick(DialogInterface dialog,

									int whichButton) {

								Toast.makeText(getActivity(), "确定",

										Toast.LENGTH_SHORT).show();

							}

						})

				.setNegativeButton(android.R.string.cancel,

						new DialogInterface.OnClickListener() {

							public void onClick(DialogInterface dialog,

									int whichButton) {

								Toast.makeText(getActivity(), "取消",

										Toast.LENGTH_SHORT).show();

							}

						}).create();

	}

}

调用:

MyAlertDialogFragment dialogFragment = new MyAlertDialogFragment();

dialogFragment.show(getFragmentManager(), "dialog");
类型 / 做法 要点
AlertDialog 0–3 个按钮,可带单选/多选列表,最常用
ProgressDialog 进度环或进度条,继承 AlertDialog
Date/TimePickerDialog 选日期或时间
自定义 Dialog 继承 AlertDialog,setContentView 自己的布局
Activity 托管 showDialog / onCreateDialog / dismissDialog
DialogFragment 推荐的现代写法,用 FragmentManager.show

一句话总结:提示和确认用 AlertDialog,进度用 ProgressDialog;自定义就继承 Dialog/AlertDialog,长期维护更推荐 DialogFragment。

转载请注明来源:Android对话框Dialog
本文链接地址:https://ai.zhousir.top/?p=825
回复 取消