Dialog 使用方法详解

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 相关的知识点已结束。

    至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

    如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。

    既然都看到这里,领两个红包在走吧!
    以下两个红包每天都可以领取

    1.支付宝搜索 522398497,或扫码支付宝红包海报。

    支付宝扫一扫,每天领取大红包

    2.微信红包,微信扫一扫即可领取红包

     

    微信扫一扫,每天领取微信红包

    小礼物走一走,来简书关注我

    posted @   程序员Android的博客  阅读(493)  评论(0编辑  收藏  举报
    编辑推荐:
    · 如何编写易于单元测试的代码
    · 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
    · .NET Core 中如何实现缓存的预热?
    · 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
    · AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
    阅读排行:
    · 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
    · 地球OL攻略 —— 某应届生求职总结
    · 周边上新:园子的第一款马克杯温暖上架
    · 提示词工程——AI应用必不可少的技术
    · Open-Sora 2.0 重磅开源!
    点击右上角即可分享
    微信分享提示