Dialog 使用方法详解

来源:互联网 发布:dd linux命令复制磁盘 编辑:程序博客网 时间:2024/06/16 05:10

Dialog 是Android 常用控件之一,主要以弹出框的形式与用户进行交互。对话框是提示用户作出决定或输入额外信息的小窗口。 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件。

​欢迎关注微信公众号:程序员Android
公众号ID:ProgramAndroid
获取更多信息

微信公众号:ProgramAndroid
微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。
我们不发送红包,我们只是红包的搬运工。

通过本章学习可以快速掌握Dialog的使用方法。主要涉及的知识点如下:

  1. 简单对话框
  2. 多选按钮对话框
  3. 单选按钮对话框
  4. 列表对话框
  5. 水平进度条对话框
  6. 圆形进度条对话框
  7. 自定义图文对话框
  8. 自定义输入对话框
  9. 自定义样式对话框
  10. 自定义Loading样式对话框
  11. 继承 DialogFragment 实现对话框
  12. Activity形式的 对话框

Dialog 继承关系如下:

java.lang.Object   ↳    android.app.Dialog

Dialog 基本样式解析

Dialog 基本样式
Dialog 基本样式

1.标题

这是可选项,只应在内容区域被详细消息、列表或自定义布局占据时使用。 如需陈述的是一条简单消息或问题(如图 1 中的对话框),则不需要标题。

2.内容区域

它可以显示消息、列表或其他自定义布局。

3.操作按钮

对话框中的操作按钮不应超过三个。

1. 简单对话框

  • 实现效果:


    简单对话框
    简单对话框
  • 实现代码如下:

        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setIcon(R.drawable.gril).setTitle("简单对话框")                .setMessage("设置Dialog 显示的内容")                .setPositiveButton("OK", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        Toast.makeText(DiaLogMethods.this, "点击了确定按钮",                                Toast.LENGTH_SHORT).show();                    }                }).setNegativeButton("Cancle", null).create().show();

2. 多选按钮对话框

  • 实现效果:
多选按钮对话框
多选按钮对话框
  • 实现代码:
        final String font[] = { "小号字体", "中号字体", "大号字体", "超大号字体" };        final boolean[] MultiChoice = new boolean[] { false, true, false, false };        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setTitle("多选对话框")                .setIcon(R.drawable.ic_launcher)                .setMultiChoiceItems(font, MultiChoice,                        new DialogInterface.OnMultiChoiceClickListener() {                            @Override                            public void onClick(DialogInterface dialog,                                    int which, boolean isChecked) {                                MultiChoice[which] = isChecked;                                String choiceString = "";                                for (int i = 0; i < MultiChoice.length; i++) {                                    if (MultiChoice[i]) {                                        choiceString = choiceString + font[i]                                                + "  ";                                    }                                }                                if (choiceString.equals("")                                        || choiceString.length() == 0) {                                    // 都不选的处理方法                                    Toast.makeText(DiaLogMethods.this,                                            "请选择一个内容", Toast.LENGTH_SHORT)                                            .show();                                } else {                                    Toast.makeText(DiaLogMethods.this,                                            "选择的字体为" + choiceString,                                            Toast.LENGTH_SHORT).show();                                }                            }                        }).setPositiveButton("OK", null)                .setNegativeButton("Cancle", null).create().show();

3.单选按钮对话框

  • 实现效果:
单选按钮对话框
单选按钮对话框
  • 实现代码如下:
        final String font[] = { "小号字体", "中号字体", "大号字体", "超大号字体" };        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setTitle("单选对话框")                .setIcon(R.drawable.ic_launcher)                .setSingleChoiceItems(font, 0,                        new DialogInterface.OnClickListener() {                            @Override                            public void onClick(DialogInterface dialog,                                    int which) {                                Toast.makeText(DiaLogMethods.this,                                        "选择的字体为:" + font[which],                                        Toast.LENGTH_SHORT).show();                                dialog.dismiss();                            }                        }).setPositiveButton("OK", null)                .setNegativeButton("Cancle", null).create().show();

4. 列表对话框

  • 实现效果如下:
列表对话框
列表对话框
  • 实现代码如下:
        final String font[] = { "小号字体", "中号字体", "大号字体", "超大号字体" };        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setIcon(R.drawable.ic_launcher)                .setTitle(" 列表对话框")                .setItems(font, new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        Toast.makeText(DiaLogMethods.this,                                "选择内容是:" + font[which], Toast.LENGTH_SHORT)                                .show();                    }                }).setNegativeButton("Cancle", null)                .setPositiveButton("OK", null).create().show();    

5. 水平进度条对话框

  • 实现效果如下:
水平进度条对话框
水平进度条对话框
  • 实现代码如下:
        final ProgressDialog progressDialog = new ProgressDialog(                DiaLogMethods.this);        progressDialog.setTitle("进度对话框");        progressDialog.setIcon(R.drawable.ic_launcher);        progressDialog.setMessage("加载中...");        // 水平进度条显示        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);        // 圆形进度条显示        // progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);        progressDialog.setCancelable(true);        progressDialog.setButton("Cancle",                new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        Toast.makeText(DiaLogMethods.this, "取消进度条对话框",                                Toast.LENGTH_LONG).show();                        progressDialog.cancel();                        count = 0;                    }                });        progressDialog.setMax(100);        progressDialog.show();        count = 0;        new Thread() {            @Override            public void run() {                while (count <= 100) {                    progressDialog.setProgress(count++);                    try {                        Thread.sleep(50);                    } catch (InterruptedException e) {                        progressDialog.dismiss();                        e.printStackTrace();                    }                }                progressDialog.dismiss();            }        }.start();    

6. 圆形进度条对话框

  • 实现效果如下:
 圆形进度条对话框
圆形进度条对话框
  • 实现代码如下:
        final ProgressDialog progressDialog = new ProgressDialog(                DiaLogMethods.this);        progressDialog.setTitle("进度对话框");        progressDialog.setIcon(R.drawable.ic_launcher);        progressDialog.setMessage("加载中...");        // 水平进度条显示        // progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);        // 圆形进度条显示        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);        progressDialog.setCancelable(true);        progressDialog.setButton("确定", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                Toast.makeText(DiaLogMethods.this, "取消进度条对话框",                        Toast.LENGTH_LONG).show();                progressDialog.cancel();                count = 0;            }        });        progressDialog.setMax(100);        progressDialog.show();        count = 0;        new Thread() {            @Override            public void run() {                while (count <= 100) {                    progressDialog.setProgress(count++);                    try {                        Thread.sleep(50);                    } catch (InterruptedException e) {                        progressDialog.dismiss();                        e.printStackTrace();                    }                }                progressDialog.dismiss();            }        }.start();    

注意 :
水平进度条,圆形进度条的区别 如下:
// 水平进度条显示
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 圆形进度条显示 progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

7. 自定义图文对话框

  • 实现效果如下:
自定义图文对话框
自定义图文对话框
  • 实现代码如下:
        AlertDialog.Builder builder = new AlertDialog.Builder(this);        View contextview = getLayoutInflater().inflate(                R.layout.dialog_customt_img_tv, null);        LinearLayout linearLayout1 = (LinearLayout) findViewById(R.id.linlout1);        LinearLayout linearLayout2 = (LinearLayout) findViewById(R.id.linlout2);        ImageView img1 = (ImageView) contextview.findViewById(R.id.img1);        TextView tv1 = (TextView) contextview.findViewById(R.id.tv1);        // 这里可以处理一些点击事件        builder.setIcon(R.drawable.gril).setTitle("自定义对话框")                .setView(contextview)                // 或者在这里处理一些事件                .setPositiveButton("OK", null)                .setNegativeButton("Cancle", null).create().show();    

注意: 1. 自定义图文对话框的布局如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal">    <ImageView        android:id="@+id/img2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher" />    <TextView        android:id="@+id/tv2"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"        android:layout_weight="1"        android:text="自定义Dialog"        android:textColor="@android:color/black"        android:textSize="25sp" /></LinearLayout>

8. 自定义输入对话框

  • 实现效果如下:


    自定义输入对话框
    自定义输入对话框
  • 实现代码如下:
        AlertDialog.Builder builder = new AlertDialog.Builder(this);        View Tittleview = getLayoutInflater().inflate(                R.layout.dialog_custom_layout, null);        ImageView img2 = (ImageView) Tittleview.findViewById(R.id.img2);        TextView textView = (TextView) Tittleview.findViewById(R.id.tv2);        textView.setText("自定义对话框");        img2.setImageResource(R.drawable.ic_launcher);        // 自定义tittle        builder.setCustomTitle(Tittleview);        View contentView = getLayoutInflater().inflate(                R.layout.dialog_custom_et, null);        EditText username = (EditText) contentView.findViewById(R.id.username);        EditText passworld = (EditText) contentView                .findViewById(R.id.passworld);        builder.setView(contentView);        builder.setPositiveButton("OK", null).setNegativeButton("Cancle", null)                .create().show();    

注意 : 自定义对话框 布局如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal">    <ImageView        android:id="@+id/img2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher" />    <TextView        android:id="@+id/tv2"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"        android:layout_weight="1"        android:text="自定义Dialog"        android:textColor="@android:color/black"        android:textSize="25sp" /></LinearLayout>

9. 自定义样式对话框

  • 实现效果如下:
自定义样式对话框
自定义样式对话框
  • 实现代码如下:
        // 对话框和activity绑定,所以必须传递activity对象        Builder builder = new AlertDialog.Builder(this);        // 获取对话框对象        final AlertDialog dialog = builder.create();        // 修改对话框的样式(布局结构)        View view = View.inflate(this, R.layout.dialog_custom_style, null);        // 因为在2.3.3版本上,系统默认设置内间距,所以需要去除此内间距        // dialog.setView(view);        dialog.setView(view, 0, 0, 0, 0);        // 找到对话框中所有控件        Button bt_submit = (Button) view.findViewById(R.id.bt_submit);        Button bt_cancel = (Button) view.findViewById(R.id.bt_cancel);        final EditText et_set_psd = (EditText) view                .findViewById(R.id.et_set_psd);        final EditText et_confirm_psd = (EditText) view                .findViewById(R.id.et_confirm_psd);        bt_submit.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // 如果用户没有输入两次密码,告知用户输入密码                String psd = et_set_psd.getText().toString().trim();                String confirmPsd = et_confirm_psd.getText().toString().trim();                if (!TextUtils.isEmpty(psd) && !TextUtils.isEmpty(confirmPsd)) {                    if (psd.equals(confirmPsd)) {                        // 当前的对话框隐藏                        dialog.dismiss();                    } else {                        Toast.makeText(getApplicationContext(), "两次输入密码不一致",                                Toast.LENGTH_SHORT).show();                    }                } else {                    Toast.makeText(getApplicationContext(), "密码不能为空",                            Toast.LENGTH_SHORT).show();                }            }        });        bt_cancel.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                dialog.dismiss();            }        });        // 展示对话框        dialog.show();    

注意: 1. 自定义样式布局如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#fff"    android:orientation="vertical" >    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@android:color/holo_blue_light"        android:gravity="center"        android:textColor="@android:color/white"        android:layout_marginBottom="10dp"        android:padding="10dp"        android:text="设置密码"        android:textSize="20sp" />    <EditText        android:id="@+id/et_set_psd"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="2dp"        android:background="@drawable/edittext_background"        android:hint="输入密码"        android:inputType="textPassword"        android:padding="5dp"        android:textSize="22sp" />    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:layout_marginBottom="2dp"        android:layout_marginTop="2dp"        android:background="@drawable/tittle_bg" />    <EditText        android:id="@+id/et_confirm_psd"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="2dp"        android:background="@drawable/edittext_background"        android:hint="确认密码"        android:inputType="textPassword"        android:padding="5dp"        android:textSize="22sp" />    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:layout_marginTop="5dp"        android:background="@drawable/tittle_bg" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginBottom="3dp"        android:layout_marginTop="3dp"        android:orientation="horizontal" >        <Button            android:id="@+id/bt_submit"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_margin="5dp"            android:layout_weight="1"            android:background="@drawable/selector_btn_normal"            android:text="确认" >        </Button>        <Button            android:id="@+id/bt_cancel"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_margin="5dp"            android:layout_weight="1"            android:background="@drawable/selector_btn_normal"            android:text="取消" >        </Button>    </LinearLayout></LinearLayout>

注意 : 2 EditText 的背景是画的圆角矩形

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle">    <!-- 圆角-->    <corners android:radius="5dp" />    <!--描边-->    <stroke        android:width="1dp"        android:color="@color/grey" /></shape>

10. 自定义Loading样式对话框

  • 实现效果如下:
自定义Loading样式对话框
自定义Loading样式对话框
  • 实现代码如下:
        LayoutInflater inflater = LayoutInflater.from(this);        View v = inflater.inflate(R.layout.dialog_custom_style_progress, null);        LinearLayout layout = (LinearLayout) v.findViewById(R.id.dialog_view);        ImageView spaceshipImage = (ImageView) v.findViewById(R.id.img);        TextView tipTextView = (TextView) v.findViewById(R.id.tipTextView);        Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this,                R.anim.loading_animation);        spaceshipImage.startAnimation(hyperspaceJumpAnimation);        Dialog loadingDialog = new Dialog(this, R.style.loading_dialog);        // loadingDialog.setCancelable(true);//“返回键”取消 不可以用        loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(                LinearLayout.LayoutParams.MATCH_PARENT,                LinearLayout.LayoutParams.MATCH_PARENT));        loadingDialog.show();    

注意:1. 自定义样式如下:

> <!-- 自定义loading dialog样式 -->    <style name="loading_dialog" parent="android:style/Theme.Dialog">        <item name="android:windowFrame">@null</item>        <item name="android:windowNoTitle">true</item>        <item name="android:windowBackground">@drawable/loading_bg</item>        <item name="android:windowIsFloating">true</item>        <item name="android:windowContentOverlay">@null</item>    </style>

注意:2. 自定义样式动画如下:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:shareInterpolator="false" >    <!-- 自定义旋转的动画 -->    <rotate        android:duration="800"        android:fromDegrees="0"        android:interpolator="@android:anim/linear_interpolator"        android:pivotX="50%"        android:pivotY="50%"        android:repeatCount="-1"        android:repeatMode="restart"        android:startOffset="-1"        android:toDegrees="+360" /></set>

注意 3. 自定义样式的布局如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/dialog_view"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/loading_bg"    android:gravity="center"    android:orientation="vertical" >    <ImageView        android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="20dp"        android:layout_marginRight="20dp"        android:layout_marginTop="20dp"        android:gravity="center_horizontal"        android:src="@drawable/loading" />    <TextView        android:id="@+id/tipTextView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="20dp"        android:layout_marginRight="20dp"        android:layout_marginBottom="20dp"        android:layout_marginTop="10dp"        android:gravity="center_horizontal"        android:text="loading..."        android:textColor="@android:color/holo_green_light"        android:textSize="20sp" /></LinearLayout>

11. 继承 DialogFragment 实现对话框

  • 实现效果如下:
继承 DialogFragment 实现对话框
继承 DialogFragment 实现对话框
  • 实现代码如下:

1.自定义继承DialogFragment 类

public class CustomDialogFragment extends DialogFragment {    @Override    public Dialog onCreateDialog(Bundle savedInstanceState) {          // Use the Builder class for convenient dialog construction        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());        builder.setMessage("通过 DialogFragment 创建对话框")               .setTitle("DialogFragment")               .setPositiveButton("OK", new DialogInterface.OnClickListener() {                   public void onClick(DialogInterface dialog, int id) {                      Toast.makeText(getActivity(), "点击 OK", Toast.LENGTH_SHORT).show();                    }               })               .setNegativeButton("cancle", new DialogInterface.OnClickListener() {                   public void onClick(DialogInterface dialog, int id) {                       // User cancelled the dialog                   }               });        // Create the AlertDialog object and return it        return builder.create();    }}
  1. Activity 调用显示Dialog方法
CustomDialogFragment  customDialogFragment=new CustomDialogFragment();        customDialogFragment.show(getFragmentManager(), "fragment");

12. Activity形式的 对话框

只需创建一个 Activity,并在 <activity> 清单文件元素中将其主题设置为 Theme.Holo.Dialog:

<activity android:theme="@android:style/Theme.Holo.Dialog" >

至此,Dialog 相关的知识点已结束。

​欢迎关注微信公众号:程序员Android
公众号ID:ProgramAndroid
获取更多信息

微信公众号:ProgramAndroid
微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。
我们不发送红包,我们只是红包的搬运工。


点击阅读原文,获取更多福利




​欢迎关注微信公众号:程序员Android
公众号ID:ProgramAndroid
获取更多信息

微信公众号:ProgramAndroid
微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。
我们不发送红包,我们只是红包的搬运工。