对话框在android_android fragment调用对话框对话框 - CSDN
  • Android对话框的使用总结

    千次阅读 多人点赞 2016-10-14 19:15:17
    本文对各类对话框的设计和使用都有...一个对话框一般是一个出现当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能.

    一.相关概念



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


    Android API 支持下列类型的对话框对象:

    (一)警告对话框 AlertDialog: 一个可以有0到3个按钮, 一个单选框或复选框的列表的对话框. 警告对话框可以创建大多数的交互界面, 是推荐的类型.

    (二)进度对话框 ProgressDialog: 显示一个进度环或者一个进度条. 由于它是AlertDialog的扩展, 所以它也支持按钮.

    (三)日期选择对话框 DatePickerDialog: 让用户选择一个日期.

    (四)时间选择对话框 TimePickerDialog: 让用户选择一个时间


    二.AlertDialog的创建和使用



    AlertDialog是Dialog的一个直接子类,使用AlertDialog,我们可以显示一个标题,最多3个按钮操作,以及一组选择框或者是自己定义的弹出框。
    AlertDialog要使用Builder设计模式来创建对象 。

    (一)Dialog的创建和使用


    在时间应用中的对话框基本不用Dialog而是用它的子类。
    这里简单使用一下Dialog,代码如下:

    // 普通的对话框,普通的对话框功能很少,除非重写类
        public void bt1(View v) {
            // 创建对话框对象
            Dialog dialog = new Dialog(this);
            // 创建对话框内容  
             dialog.setTitle("对话框的标题");     
            // 显示对话框
            dialog.show();
    
        }


    运行后显示结果:

    Dialog1

    可以看到有一个标题的对话框,而且这里没有设置内容的属性,Dialog的使用方法和功能都是很少的,不建议使用。

    (二)比较正常的AlertDialog的创建和使用

    代码设计:

    // 警告对话框,需要用Builder方法创建
        public void bt2(View v) {
            // 这里的属性可以一直设置,因为每次设置后返回的是一个builder对象
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            // 设置提示框的标题
            builder.setTitle("提示标题").
            // 设置提示框的图标
                    setIcon(R.drawable.ic_launcher).
                    // 设置要显示的信息
                    setMessage("文本的提示信息:你妈喊你回家吃饭了!").
                    // 设置确定按钮
                    setPositiveButton("确定", new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(MainActivity.this, "选择就确定哦", 0).show();
    
                        }
                    }).
    
                    // 设置取消按钮,null是什么都不做
                    setNegativeButton("取消", null).
                    // 设置退出按钮,在中间的按钮
                    setNeutralButton("退出", new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 退出程序
                            finish();
    
                        }
                    });
            // 生产对话框
            AlertDialog alertDialog = builder.create();
            // 显示对话框
            alertDialog.show();
    
        }

    程序运行后显示的结果:

    AlertDialog2

    这里如果点击取消,对话框消失,什么都没有做。
    如果点击退出,会直接退出程序。
    如果点击确定,会弹出一个土司,提示你。
    这里可以根据用户的选择做出相应的行为。


    (三)设计一个选择菜单样式的对话框

    代码设计:

        //数据源
        String[] array = new String[] { "音乐", "体育", "舞蹈", "看书" };
    
        // 显示一个菜单的对话框选项,点击选择菜单后,菜单会消失
    
        // 匿名类去创建
        public void bt3(View v) {
    
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            // 设置标题
            builder.setTitle("选择你最喜欢的课程").
            // 设置可选择的内容,并添加点击事件
                    setItems(array, new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // which代表的是选择的标签的序列号
    
                            Toast.makeText(MainActivity.this, "选择" + array[which],
                                    0).show();
    
                        }
                    }).
                    // 产生对话框,并显示出来
                    create().show();
    
        }

    程序运行后显示的结果:

    菜单对话框

    设置菜单是builder的setItem方法来完成的。
    点击某一个菜单选项后对话框会自动消失,所以这里设置按钮也是没有什么用处的。
    这里还能监听点击菜单的事件,获取用户的选择内容。



    (四)设置一个单选按钮菜单的对话框

    其实这个对话框和上面的菜单对话框差不多,只是样式改变了,还有一点不同的是点击一个选项后对话框是不会消失的,所以必须要设置按钮,来使对话框消失。

    代码设计:

    // 单选按钮的对话框,选择一个按钮值后,
        // 对话框也是不会自动消失,需要自己关闭
        // 要设置按钮,点击按钮后对话框才会消失
        public void bt4(View v) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            // 设置标题
            builder.setTitle("选择你最喜欢的课程").
            // 设置可选择的内容,并添加点击事件
            // 第一个参数是可以选择的单选框的内容
            // 第二个参数是默认选中的项
            // 第三个参数是点击选中的监听器
                    setSingleChoiceItems(array, 0, new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
                            Toast.makeText(MainActivity.this, "选择" + array[which],
                                    0).show();
    
                        }
                    }).
                    // 因为对话框不会自动消失,所以要添加按钮的必要
                    // 设置确定按钮
                    setPositiveButton("确定", new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(MainActivity.this, "选择确定", 0).show();
                        }
                    }).
                    // 取消,什么都不做,对话框消失而已
                    setNegativeButton("取消", null).
                    // 产生对话框,并显示出来
                    create().show();
    
        }


    运行后的结果:

    单选对话框

    设置单选菜单是builder的setSingleChoiceItem方法来完成的。
    这里要可以设置两个监听事件,一个是单选按钮某一个选项被选中时触发的,另一个是点击按钮时触发的事件。
    程序中每次选中一个单选按钮都会弹出一个吐司,提示你选择的内容,点击确定后也会显示一个吐司。


    (五)多选项的对话框设计

    多选框的显示和单选的显示也是有点相似的,都是需要设置按钮来使对话框消失。
    代码如下:

    // 多选按钮的对话框
        // 对话框也是不会自动消失,需要自己关闭
        // 要设置按钮,点击按钮后对话框才会消失
        public void bt5(View v) {
    
            // 多选按钮的默认状态
            boolean[] checkedItems = { true, false, false, true };
    
            // 多选按钮选中后保存的数据
            final List<String> list = new ArrayList<String>();
            // 默认的数据
            list.add("音乐");
            list.add("看书");
            // 创建对话框的builder对象
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    
            // 设置标题
            builder.setTitle("选择你最喜欢的课程").
            // 设置可选择的内容,并添加点击事件
            // 第一个参数是可以选择的选框的内容
            // 第二个参数是一个布尔数组,如果是true代表的是默认选中
            // 第三个参数是点击选中的监听器
                    setMultiChoiceItems(array, checkedItems,
                            new OnMultiChoiceClickListener() {
    
                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which, boolean isChecked) {
                                    // 这里无论某个选项是被选中后被取消都会触发该方法
                                    // which代表的是选中的是多少游标值的选项
                                    // isChecked是代表该选项是或否选中了
                                    // 判断如果集合中有某个数据,就把他移除,否则就添加数据
                                    // 注意这里数选择之后的状态
                                    if (isChecked) {
                                        // 添加数据
                                        list.add(array[which]);
                                    } else {
                                        // 移除数据
                                        list.remove(array[which]);
                                    }
    
                                }
                            }).
                    // 因为对话框不会自动消失,所以要添加按钮的必要
                    // 设置确定按钮
                    setPositiveButton("确定", new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(MainActivity.this, "你选中了" + list, 0)
                                    .show();
                        }
                    }).
                    // 取消,什么都不做,对话框消失而已
                    setNegativeButton("取消", null).
                    // 产生对话框,并显示出来
                    create().show();
    
        }


    程序运行后的结果:

    多选框

    设置多选菜单是builder的setMultiChoiceItem方法来完成的。
    这里要可以设置两个监听事件,一个是选项框的某一个选项的状态改变时触发的,另一个是点击按钮时触发的事件。
    程序中每次改变选项的内容,保存数据的集合都会改变,点击确定后也会显示一个吐司,显示集合里面的内容。

    选择全部内容后,确定,显示的结果:

    多选框点击后结果


    (六)使用适配器显示对话框


    使用适配器显示对话框和显示菜单对话框类似,都是选中对应选项后,对话框自动消失,但是使用适配器可以显示很负责的界面。

    // 使用适配器显示对话框-->builder的setAdapter方法
        // 这里选择一个选项后,对话框就会关闭,所以是不需要设置按钮的
        // 其实这里可以设置很复杂的适配器对象,但是实际应用中不会在对话框显示太复杂的布局
        public void bt6(View v) {
    
            // 创建ArrayAdapter适配器
            // android.R.layout.simple_list_item_1是Android系统里面的简单布局
            // 第三个参数是数据源
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, array);
    
            // 创建对话框对象
            new AlertDialog.Builder(this).
            // 设置标题
                    setTitle("使用适配器显示数据").
                    // 添加适配器,并为适配器添加点击事件
                    setAdapter(adapter, new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // which是选择的条目的游标值
                            Toast.makeText(MainActivity.this, "选择" + array[which],
                                    0).show();
                        }
                    }).
                    // 产生并显示
                    create().show();
    
        }


    运行程序后显示的结果:

    适配器

    设置多选菜单是builder的setAdapter方法来完成的。
    这里要设置一个监听事件,适配器的监听事件。
    这里点击某一个选项后,对话框消失,并土司选中的内容。


    (七)设计一个有输入框的对话框

    // 设置一个有输入文本的对话框---->builder的setView方法
        // 输入数据后,对数据进行处理
        // 这里要设置按钮,才能对数据的数据进行处理
        public void bt7(View v) {
    
            // 创建一个EditText对象
            final EditText et = new EditText(this);
    
            // 创建对话框对象
            new AlertDialog.Builder(this).
            // 设置标题
                    setTitle("有输入框的对话框").
                    // 添加输入的文本框
                    setView(et).
                    // 添加确定按钮
                    setPositiveButton("确定", new OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 获取输入的字符
                            String in = et.getText().toString();
                            Toast.makeText(MainActivity.this, "输入;" + in, 0).show();
                        }
                    }).setNegativeButton("取消", null).
                    // 产生并显示
                    create().show();
    
        }

    运行后的结果:

    有输入框的对话框

    设置输入框是builder的setView方法来完成的。
    这里要设置一个按钮监听事件。
    这里点击确定按钮后,获取输入框的内容并土司出来。


    (八)使用对话框内的控件控制对话框

    这里使用对话框内的一个布局文件的按钮,来关闭对话框

        // 使用对话框内的控件来关闭对话框
        public void bt8(View v) {
    
            // 创建一个EditText对象
            final Button btn = new Button(this);
            // 给按钮设置文字
            btn.setText("关闭对话框");
            // 创建对话框对象
            final AlertDialog dialog = new AlertDialog.Builder(this).
            // 设置标题
                    setTitle("通过按钮关闭对话框").
                    // 添加输入的文本框
                    setView(btn).
                    // 产生
                    create();
    
            // 设置对话框不可以关闭,一般情况下对话框是失去焦点后自动消失的
            // 但是加 了.setCancelable(false),对话框就不会消失,除非手动退出
            dialog.setCancelable(false);
    
            btn.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // 点击后关闭对话框,两种方法都可以
                     dialog.cancel();
                    //dialog.dismiss();
                }
            });
    
            // 显示
            dialog.show();
    
            //给对话框设置一个监听时间,对话框退出前会执行
            dialog.setOnDismissListener(new OnDismissListener() {
    
                @Override
                public void onDismiss(DialogInterface dialog) {
                    // 只要关闭都会调用
                    Toast.makeText(MainActivity.this, "关闭", Toast.LENGTH_SHORT)
                            .show();
                }
            });
    
        }

    运行结果:

    关闭对话框

    这里设置了dialog.setCancelable(false);的属性,代表了对话框不能随着焦点的失去而消失对话框,要收到关闭对话框,要么设置确定和取消按钮,要么在对话框布局中设置能够关闭对话框的控件;




    (九)AlertDialog的详细属性

    对话框的全部属性表现,如图所示:
    Dialog属性图


    这里分上、中、下三部分。
    区域一是标题相关
    区域二是主体相关
    区域三是按钮相关


    其中任何部分都可以不设置,
    但是有一点要注意的是主体内容只能有一种,比如:设置了SetMessage不能再设置SetAdapter或SetView。因为设置了也不会显示的。

    1.区域1那里就是定义弹出框的头部信息

    包括标题名或者是一个图标。
    (1)setTitle : 为对话框设置标题
    (2)setIcon : 为对话框设置图标

    2.区域2那里是AlertDialog对话框的content部分

    在这里我们可以设置一些message信息,或者是定义一组选择框,还可以定义我们自己的布局弹出框。
    (1)setMessage: 为对话框设置内容,如果设置了其他内容,那么Message不要设置,否者只显示Message。
    (2)setView: 给对话框设置自定义View
    setItems: 设置对话框要显示的一个list,一般用于显示几个命令时
    //items是传入一个字符串数组,或者是R文件中的数组
    (3)setSingleChoiceItems: 用来设置对话框显示一系列的单选按钮
    (4)setMultiChoiceItems: 用来设置对话框显示一系列的复选框

    3.区域3那里使我们的Action Buttons部分

    这里我们可以定义我们的操作按钮。
    在AlertDialog中,定义按钮都是通过 setXXXButton 方法来完成,其中一共有3种不同的Action Buttons供我们选择:
    (1)setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
    这是一个相当于OK、确定操作的按钮.
    (2)setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
    这是一个相当于取消操作的按钮。

    (3)setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
    这个是相当于一个忽略操作的按钮。

    触发相关按钮都的行为都是我们程序员自己定的,比如你可以设置点击确定后关闭页面,也可以设置点击取消后关闭页面。但是我们设计的时候还是要按照大部分人的阅读习惯来设定。

    4.监听事件的说明

    在AlertDialog的各种设置中,都充斥着DialogInterface.OnClickListener,比如按钮,内容区的items,单选按钮等,只有多选按钮是用了另外一个监听
    DialogInterface.OnMultiChoiceClickListener。

    (1)单选按钮的监听
    public void onClick(DialogInterface dialog, int which);
    //which代表items,单选按钮中的序号

    (2)多选按钮的监听
    public void onClick(DialogInterface dialog, int which, boolean isChecked);
    //which代表items,单选按钮中的序号
    //isChecked代表当前点击的序号是否被勾选

    (3)Adapter的监听
    AlertDialog还支持ListAdapter的子类,我们可以传入各种ListAdapter的子类,来显示复杂的列表,当然直接使用 setView 也可以办到
    public Builder setAdapter(final ListAdapter adapter, final
    OnClickListener listener)

    三.ProgressDialog进度对话框


    ProgressDialog是AlertDialog类的子类,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。它的用处非常广泛,在每次用户操作一个延迟的任务时,我们都必须以进度对话框的形式告诉用户,否者用户并不知道操作已经开始,可能会多次操作同一个任务,并有可能导致异常发生。

    (一)构造方法和常用方法

    1.构造方法需要传入一个上下文
    public ProgressDialog(Context context)

    2.给定一个样式,带进度条和不带进度条的样式
    public void setProgressStyle(int style) //可选值
    //STYLE_SPINNER 默认 圆形,没有进度条的样式
    //STYLE_HORIZONTAL 给定进度条的样式

    3.设置进度最大值,需要给定STYLE_HORIZONTAL
    public void setMax(int max)

    4.是否能用返回键关闭 true可以关闭,false不能关闭
    public void setCancelable(boolean flag)

    5.设置一个消息
    public void setMessage(CharSequence message)

    6.判断Dialog是否显示
    public boolean isShowing()

    7.关闭对话框
    public void dismiss()

    8.ProgressDialog从AlertDialog中继承的常用方法setIcon和setTitile

    9.虽然ProgressDialog可以设置Button,但是我们一般都不会去使用它

    (二)进度对话框的设计的使用

    1.圆形进度条对话框

    // 显示圆形的进度框
        public void bt1(View v) {
            // 创建进度条的对话框
            ProgressDialog dialog = new ProgressDialog(this);
            // 设置进度条的样式,选择圆形或条状
            // 这里这圆形的
            dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            // 设置标题
            dialog.setTitle("文件下载");
            // 设置文本信息
            dialog.setMessage("正在下载。。。");
            // 设置是否能用后退键出对话框
            // 选择false就代表不能
            // 如果设置为false,程序可能退出不了
            dialog.setCancelable(true);
            // 显示对话框
            dialog.show();
        }

    程序运行后的结果:

    圆形进度条对话框

    这里点击进度对话框的其他地方,对话框就消失了。因为默认情况,对话框失去焦点就会消失。

    2.条形对话框

    // 显示设置水平的进度框
        public void bt2(View v) {
            // 创建进度条的对话框
            final ProgressDialog dialog = new ProgressDialog(this);
            // 设置进度条的样式,选择圆形或条状
            // 这里这圆形的
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            // 设置标题
            dialog.setTitle("文件下载");
            // 设置文本信息
            dialog.setMessage("正在下载。。。");
            // 设置是否能用后退键出对话框
            // 选择false就代表不能
            // 如果设置为false,程序可能退出不了
            dialog.setCancelable(false);
            // 显示对话框
            dialog.show();
    
            // 这里新建一个线程来,跟新进度和关闭页面
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    // 获取进度值的当前的值
                    int index = 0;
                    // 跟新进度
                    while (index < dialog.getMax()) {
                        index++;
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        // 设置进度的值
                        dialog.setProgress(index);
    
                    }
    
                    // 完成任务后,退出对话框
                    dialog.cancel();
    
                }
            }).start();
    
        }

    运行结果:
    水平进度条

    这个进度对话框是没有办法取消的,因为设置了:dialog.setCancelable(false);
    只能等到文件下载完成后对话框自动消失。这个设置在实际应用中也是会有用到的,比如复制文件,不能随便打断。本示例中,进度的跟新需要用子线程来更新,进度条的更新可以直接在子线程中实现,而其他布局的跟新是不能在子线程中直接更新的。要使用runOnUIThread();方法来更新主线程的界面,



    四.时间和日期选择器对话框

    (一)时间和日期对话框的方法

    DatePickerDialog与TimePickerDialog都继承于AlertDialog,基本方法和我们前面讲的DatePicker和TimePicker组件一样,只是需要调用Dialog的show方法来显示。在构造方法里需要传入回调监听

    1.用户改变时间后的监听

    public interface OnTimeChangedListener { void onTimeChanged(TimePicker view, int hourOfDay, int minute);
    }

    2.用户改变日期后的监听

    public interface OnDateChangedListener { void onDateChanged(DatePicker view, int year, int monthOfYear,
    int dayOfMonth);
    }

    (二)时间对话框的使用

    // 显示时间的对话框
        public void btn1(View v) {
            // 第一个参数是上下文
            // 第二个参数是监听时间选择后的事件
            // 后面两个数是默认是时间
            // 后一个是代表是否显示时间的格式是24小时制的
            TimePickerDialog dialog = new TimePickerDialog(this,
                    new OnTimeSetListener() {
    
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay,
                                int minute) {
                            Toast.makeText(MainActivity.this,
                                    hourOfDay + "时" + minute + "分", 0).show();
    
                        }
                    }, 21, 8, true);
    //显示标题
            dialog.setTitle("选择你要设定的时间");
            // 显示时间的对话框
            dialog.show();
    
        }


    运行后显示的结果:

    时间选择

    这是时间对话框的选择按钮,其中也可以设置很多属性。
    这里点击完成后会弹出一个选择的时间的土司。
    如图所示:

    时间

    (三)日期对话框的使用

    // 显示日期的对话框
        public void btn2(View v) {
            // 第一个参数是上下文
            // 第二个参数是监听时间选择后的事件
            // 后面三个数是默认是日期数
            DatePickerDialog dialog = new DatePickerDialog(this,
                    new OnDateSetListener() {
                        // 日期选择器上的月份是从0开始的
    
                        @Override
                        public void onDateSet(DatePicker view, int year,
                                int monthOfYear, int dayOfMonth) {
                            Toast.makeText(
                                    MainActivity.this,
                                    year + "年" + (monthOfYear + 1) + "月"
                                            + dayOfMonth + "日", 0).show();
    
                        }
                    }, 2016, 11, 13);
            // 显示时间的对话框
            dialog.show();
    
        }

    点击运行后,显示结果:

    日期对话框

    上面是日期对话框的默认画面,也是挺好看的,实际中也可以根据实际需要对它的页面样式进行修改。

    点击完成后显示的结果:

    日期结果


    总结:
    以上就是Android对话框大部分控件的基本使用。
    对于有些对话框选择之后对话框会自动消失,就没有必要设置ActionButton了
    但是有些对话框是不会自动消失的,就需要设置ActionButton或在页面布局中有可以关掉对话框的控件。
    对于有些界面没有设计得很好看,这个需要自己花时间去慢慢琢磨,这里只是介绍它们的用法和一些属性。还有它们的简单效果。

    展开全文
  • 最近半个月又写点android了(时隔2年半) 事情是这样的.用Weex做的App 的对话框在某些手机上对话框能显示按钮,有些不能显示 如图 锁定问题 1)是否修改过对话框Native的对话框代码?是否修改过对话框调用Weex的JS...

    最近半个月又写点android了(时隔2年半)

    事情是这样的.用Weex做的App 的对话框在某些手机上对话框能显示按钮,有些不能显示

    如图



    锁定问题

    1)是否修改过对话框Native的对话框代码?是否修改过对话框调用Weex的JS代码?

    2)哪些手机能再现?哪些不能?

    3)能再现该问题的手机 Weex的Playground的代码是否正常运行?该正常运行代码能否在自己工程里面正常运行?


    锁定结果

    1)没有修改过Native的对话框代码也没有修改过Weex的JS代码,

    2)android版本6.0以上的手机再现,6.0以下的手机可以正常显示

    3)6.0以上的WeexPlayground代码能正常运行.在自己工程里面不能正常运行.


    调查路线

    1)调查对话框在6.0以上有什么变化?

    2)自己工程依赖的控件包是否是指定的正常的包?

    2)查看控件的布局边界该按钮是否存在。


    调查结果

    1)5.0以上android的增加了权限询问,很多文档上说需要设置这两权限。

        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
        <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
    对这两个权限抱有疑问,文档上面说的是:只有该对话框是处于所有App顶层的时候才需要,一般App不需要。

    删除这两个权限设置后发现也是可以运行的。

    android权限说明请参考: 链接


    2)自己工程包的依赖的对话框的包是正常的,有些博客上说自己依赖的包版本不是5.0以上,导致对话框文字不能显示。

    查看自己的包依赖如下:android.support.v7.app.AlertDialog


    3)打开设置-开发者选项-布局边界,Alert的控件的边界是存在的,按下按钮颜色是灰色以及文字都可以显示出来。


    调查关键位置:

    既然控件在,按下的颜色也有,则说明只是按钮的文字的颜色问题。

    如果对话框没有设置自己的主题颜色,则采用的是AppTheme

    在Styles.xml中设置Style。也可以直接使用AppTheme



    结果在Color.xml的数值里面 colorAccent为FFFFFF的原因,导致按钮颜色看不见。

    修改colorAccent的值为主体颜色后对话框显示正常。





    扩展:

    增加自己的Style: 

    https://isming.me/2015/08/31/modify-alert-style/


    以及AppTheme中的各个变量对应的内容

    http://www.aoaoyi.com/archives/623.html


    参考页面:

    http://blog.csdn.net/s1991721/article/details/76054028






    展开全文
  • Android Studio对话框总结

    千次阅读 2019-04-14 17:01:36
    在Android应用开发中,程序与用户交互的方式会直接影响到用户的使用体验,对话框又是与用户交互必不可少的部分。我们经常会需要界面上弹出一个对话框,让用户点击对话框的某个按钮、选项,或者是输入一些文本,...

    在Android应用开发中,程序与用户交互的方式会直接影响到用户的使用体验,对话框又是与用户交互必不可少的部分。我们经常会需要在界面上弹出一个对话框,让用户点击对话框的某个按钮、选项,或者是输入一些文本,从而知道用户的做了什么操作,或是下达了什么指令。
    对话框又可以分为几类:
    1、普通对话框
    2、列表对话框
    3、单选对话框
    4、多选对话框
    5、等待对话框
    6、进度条对话框
    7、自定义对话框
    在这里插入图片描述

    废话就不多说啦,直接上代码,代码里都有详细的注释,如果不懂的话可以留言或者问一下度娘
    布局代码

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
    <Button
        android:id="@+id/btn_1"
        android:text="普通对话框1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="myclick"/>
    
        <Button
            android:id="@+id/btn_2"
            android:text="普通对话框2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="myclick"/>
        <Button
            android:id="@+id/btn_3"
            android:text="列表对话框"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="myclick"/>
    
        <Button
            android:id="@+id/btn_4"
            android:text="单选对话框"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="myclick"/>
    
        <Button
            android:id="@+id/btn_5"
            android:text="多选对话框"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="myclick"/>
    
        <Button
            android:id="@+id/btn_6"
            android:text="等待对话框"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="myclick"/>
    
        <Button
            android:id="@+id/btn_7"
            android:text="进度条对话框"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="myclick"/>
    </LinearLayout>
    

    MainActivity.java

    package com.example.dialog;
    
    import android.app.ProgressDialog;
    import android.content.DialogInterface;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate (savedInstanceState);
            setContentView (R.layout.activity_main);
        }
        public void myclick(View v){
            switch (v.getId ()){
                case R.id.btn_1:
                    showNormalDialog1();
                    break;
                case  R.id.btn_2:
                    showNormalDialog2();
                    break;
                case R.id.btn_3:
                    showListDialog();
                    break;
                case R.id.btn_4:
                    showSingleDialog();
                    break;
                case R.id.btn_5:
                    showMultiDialog();
                    break;
                case R.id.btn_6:
                    showWaitDialog();
                    break;
                case R.id.btn_7:
                    showProgressDialog();
                    break;
            }
        }
    
    
        //AlertDialog的构造方法为protected,因此外包是无法使用的,所以我们要借助构建器Builder
        private void showNormalDialog1() {
            AlertDialog.Builder dialog = new AlertDialog.Builder (this);
            dialog.setTitle ("温馨提示").setMessage ("你确定要退出此程序嘛?");
            //点击确定就退出程序
            dialog.setPositiveButton ("确定", new DialogInterface.OnClickListener () {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    MainActivity.this.finish ();
                }
            });
            //如果取消,就什么都不做,关闭对话框
            dialog.setNegativeButton ("取消",null);
            dialog.show ();
        }
        private void showNormalDialog2(){
            AlertDialog dialog2 = new AlertDialog.Builder (this).create ();
            dialog2.setTitle ("坪价");
            dialog2.setMessage ("请为本次的服务打分!");
            dialog2.setButton (DialogInterface.BUTTON_POSITIVE, "5分", new DialogInterface.OnClickListener () {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText (MainActivity.this,"5分",Toast.LENGTH_LONG).show ();
                }
            });
            dialog2.setButton (DialogInterface.BUTTON_NEGATIVE, "3分", new DialogInterface.OnClickListener () {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText (MainActivity.this,"3分",Toast.LENGTH_LONG).show ();
                }
            });
            //一定要调用show()方法,否则对话框不会显示
            dialog2.show ();
        }
        private void showListDialog(){
            final String[] items = {"小王","小李" ,"小白"};
            AlertDialog.Builder dialog3 = new AlertDialog.Builder (this).setTitle ("你是谁?")
                    .setItems (items, new DialogInterface.OnClickListener () {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //如果点击小王的话那么which保存的就是0
                            Toast.makeText (MainActivity.this,"我是:"+items[which],Toast.LENGTH_LONG).show ();
                        }
                    });
            dialog3.show ();
        }
    
        int ide = 0;  //全局变量
        private void showSingleDialog() {
            final String[] stars = {"Jay","JJ" ,"Eson"};
            final AlertDialog.Builder dialog4 = new AlertDialog.Builder (this)
                    .setTitle ("选择你喜欢的明星:")
                    //参数1:选项。参数2:默认选项。参数3:选中时的事件
                    .setSingleChoiceItems (stars, 0, new DialogInterface.OnClickListener () {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //Toast.makeText (MainActivity.this,"你选择了:"+stars[which],Toast.LENGTH_LONG).show ();
                            ide = which;
                        }
                    }).setPositiveButton ("确定", new DialogInterface.OnClickListener () {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText (MainActivity.this,"你选择了:"+stars[ide],Toast.LENGTH_LONG).show ();
                        }
                    });   //点击确定后对话框消失,并且打印所选内容
    
            dialog4.show ();
        }
    
        private void showMultiDialog() {
            AlertDialog.Builder dialog5 = new AlertDialog.Builder (this);
            final String[] movie = {"复联1","复联2","复联3","复联4"};
            final boolean[] check = {true,false,true,false};
            dialog5.setTitle ("你想看什么电影?")
                    //第一个参数是选项,第二个参数是默认备选项(true的是选中的),第三个参数是点击时触发的效果
                    .setMultiChoiceItems (movie, check, new DialogInterface.OnMultiChoiceClickListener () {
                        @Override
                        //第一个参数对话框本身,第二个参数是按钮的索引,第三个是标志按钮是否处于选中状态true
                        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                            Log.e("Log",movie[which]);
                        }
                    }).setPositiveButton ("确定", new DialogInterface.OnClickListener () {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String msg = "你喜欢的电影是:";
                        for (int n=0;n<check.length;n++){
                            if(check[n]){
                                msg = msg + movie[n] + " ";
                                Toast.makeText (MainActivity.this,msg,Toast.LENGTH_LONG).show ();
                            }
                        }
                }
            });
            dialog5.show ();
        }
    
        private void showWaitDialog() {
            //进度条对话框,默认是转圈
            ProgressDialog progressDialog = new ProgressDialog (this);
            progressDialog.setTitle ("下载中....");       //设置标题
            progressDialog.setMessage ("请等待");
            progressDialog.show ();
        }
    
        private void showProgressDialog() {
            final ProgressDialog dialog7 = new ProgressDialog (this);
            dialog7.setTitle ("下载中....");       //设置标题
            dialog7.setMessage ("请等待");
            dialog7.setProgressStyle (ProgressDialog.STYLE_HORIZONTAL);   // 设置进度条的风格(水平)
            dialog7.setIndeterminate (false);   //设置进度条模糊(默认为True)
            dialog7.show ();
            //设置进度条的动态效果,需要创建一个线程
            final Thread thread = new Thread () {
               public void run(){
                   super.run ();
                   //让进度条从1走到100
                   for (int i = 0;i<=100;i++){
                       dialog7.setProgress (i);
                       try {           //抛出异常
                           Thread.sleep (50);          //每走动一下休眠50毫秒
                       } catch (InterruptedException e) {
                           e.printStackTrace ();
                       }
                   }
                   dialog7.dismiss ();   //当进度条到达100后,对话框消失
               }
            };
            thread.start ();      //启动线程
        }
    
    
    
    }
    
    

    下面这些就是运行后的截图
    普通对话框1
    在这里插入图片描述

    普通对话框2
    在这里插入图片描述

    列表对话框
    在这里插入图片描述

    单选对话框
    在这里插入图片描述

    多选对话框
    在这里插入图片描述

    等待对话框
    在这里插入图片描述

    进度条对话框
    在这里插入图片描述

    展开全文
  • 史上最强的自定义单选多选对话框 可作为UI模板应用于项目中 少量改动即可实现定制 史上最强的自定义单选多选对话框 可作为UI模板应用于项目中 少量改动即可实现定制
  • 常用的android弹出对话框

    万次阅读 多人点赞 2011-04-06 10:09:00
    我们平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等...

    我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等方式,重写我们自己的对话框。当然,这也是不失为一个不错的解决方式,但是一般的情况却是这样,我们重写的对话框,也许只在一个特定的地方会用到,为了这一次的使用,而去创建一个新类,往往有点杀鸡用牛刀的感觉,甚至会对我们的程序增加不必要的复杂性,对于这种情形的对话框有没有更优雅的解决方案呢? 
        幸运的是,android提供了这种问题的解决方案,刚开始接触android的时候,我在做一个自定义对话框的时候,也是通过继承的方式来实现,后来随着对文档了解的深入,发现了android起始已经提供了相应的接口Dialog Builder ,下面我就吧相关的内容在这里分享一下,也能让更多的初学者少走弯路。

    首先是一个最简单的应用,就是弹出一个消息框,在android中可以这样实现




    效果如下:

    1.png 


    上面的代码中我们新建了一个AlertDialog,并用Builder方法形成了一个对象链,通过一系列的设置方法,构造出我们需要的对话框,然后调用show方法显示出来,注意到Builder方法的参数 self,这个其实是Activity对象的引用,根据你所处的上下文来传入相应的引用就可以了。例如在onCreate方法中调用,只需传入this即可。


    下面是带确认和取消按钮的对话框

    1.  
    复制代码


    2.png 

    注意到,这里有两个null参数,这里要放的其实是这两个按钮点击的监听程序,由于我们这里不需要监听这些动作,所以传入null值简单忽略掉,但是实际开发的时候一般都是需要传入监听器的,用来响应用户的操作。

    下面是一个可以输入文本的对话框

    1.  



    3.png 

    如上代码,我们用setView方法,为我们的对话框传入了一个文本编辑框,当然,你可以传入任何的视图对象,比如图片框,WebView等。。尽情发挥你的想象力吧~:lol

    下面是单选框与多选框,也是非常有用的两种对话框

    1.  
    2.                


    4.png 


    1.                



    多选对话框 

    单选和多选对话框应该是我们平时用的非常多的,代码应该很好理解,下面再最后介绍两个、

    列表对话框

    1.  



    6.png 


    最后,在对话框中显示图片

    1.  


    7.png 

          我们传入了一个ImageView来显示图片,这里显示了一个经典的android小绿人图标~ ~,当然这里还可以放上网络图片,具体的实现方法就不介绍了,留给大家来练习吧~:lol

          最后总结一下,android平台为我们开发提供了极大的便利,DialogBuilder能做的不止这些,这里给大家展示的只是冰山一角,我们可以尽情的发挥想象,创造我们自己的对话框。

     

    展开全文
  • Android Studio常用对话框

    千次阅读 2019-04-16 11:08:46
    下面是一个入门级别的案例,对话框是我们以后Android必要的一些按键。下面是我整理的三种常用对话框。 如图: 请看代码部分: 1.active_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
  • Android常用对话框大全——Dialog

    万次阅读 多人点赞 2019-09-27 16:07:57
    今天就来谈谈开发中经常用的到的一个控件——Dialog,对话框一般我们就用来提示一些信息给用户,让用户自主选择,或者一些操作不可逆的情况下我们提示用户是否继续操作,下面就让我们一起来学习吧。老司机发车啦…...
  • 进度条对话框在Android程序中显示不出来,我找不出问题的原因。使用了如下代码来显示进度条对话框: func{ progressdialog.show(); .... ..... anotherfunction(); listview.setAdapter(); ...
  • android自定义普通对话框,输入框对话框1. 普通对话框 不多说先上图 相关布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:...
  • 对话框就是一个AlertDialog,但是一个简单的AlertDialog,我们却可以将它玩出许多花样来,下面我们就来一起总结一下AlertDialog的用法。看看各位童鞋平时的工作中否都用到了AlertDialog的这些特性。OK,废话不多说...
  • Android开发 打开文件 选择文件对话框

    万次阅读 热门讨论 2016-11-30 21:51:44
    因项目需要打开文件,因此做了一个打开文件的对话框,现在把这部分的代码共享出来了。 首先是一个回调接口,该接口文件选择完毕的通知调用者进行如果何种操作。文件接口声明,如下: // filename: CallbackBundle....
  • Android系统对话框——自定义关闭

    万次阅读 2016-04-15 11:00:46
    Android系统对话框——自定义关闭Dialog是我们项目中经常用到的,5.x以后的Dialog也很好看,很安卓风,Android也给我们提供了新的包,低版本可以显示一样的效果。我们使用的导入v7包下的Dialog即可。样式不是...
  • 目的:实现常用的三种对话框——进度条、日期选择、时间选择 开发工具:Android Studio3.3.2 实现过程: 第一步:布局文件中添加三个Button用于打开三种不同类型的对话框,并将按钮设置为水平和竖直方向都居中...
  • 目的:实现普通对话框和登录对话框 开发工具:Android Studio3.3.2 实现过程: 第一步:布局文件activity_main.xml中添加两个Button用于打开对话框,并将按钮设置为水平和竖直方向都居中 要让按钮页面居中...
  • 本代码是一个集成普通对话框、单选对话框、多选对话框一体的案例。
  • Android自定义加载对话框

    千次阅读 2016-08-03 14:02:10
    Android的碎片化造成了加载对话框在不同系统和机型上的不统一,而且开发过程中,如果前期没有约束好会造成每个人都有自己的一套加载对话框.所以这里继承自Dialog自定义了一个统一样式的加载对话框要注意对话框的使用...
  • android打开一个文件对话框

    热门讨论 2020-07-29 14:18:51
    一个android对话框,最终会返回文件的地址,
  • Android对话框设置全屏

    千次阅读 2020-02-07 16:26:29
    Android对话框设置全屏 // 全屏 WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.width = WindowManager.LayoutParams.MATCH_PARENT; lp.height = WindowManager.LayoutParams....
1 2 3 4 5 ... 20
收藏数 96,000
精华内容 38,400
关键字:

对话框在android