Android复习之旅--简单使用Dialog

对话框在Android中的应用场景也是很多的,例如删除、支付等重要的操作,需要提醒用户是否继续,这样很好的提高了用户的体验

这里总结了Android中常用的对话框,虽然只是旧版本的,但当做参考也差不多足够了

对话框是提示用户作出决定或输入额外信息的小窗口。 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件

Dialog
Dialog

因为布局文件太简单这里就不展现出来了,免得占空间影响阅读

这里引入一个优化代码的理念:就是当一个布局下的子控件都要响应相同的事件或者执行相同的方法,可以通过布局对象获取到子控件,通过循环来对每一个子控件进行操作,这样既减少了代码量,也提高了应用的性能。 感觉自己表达能力欠佳,具体还是看代码吧

private Context context;  // 上下文

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
    context = this;

    // 引用布局中的根节点(优化)
    LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
    int childCount = layout.getChildCount();// 得到该布局对象的子控件的数量
    for (int i = 0; i < childCount; i++) { // 遍历布局视图
        View view = layout.getChildAt(i);
        view.setOnClickListener(this);// 对所有的子控件添加点击事件
    }
}

showDialog(int id)这方法Google已经废弃掉了,提倡使用DialogFragment来显示Dialog的。但这里只是为了把Dialog显示出来,重点是如何写Dialog,用这个就可以了。其实是我还不会用DialogFragment,哈哈,好尴尬啊

@Override
public void onClick(View v) {
    // 优化
    showDialog(v.getId());
}

重载父类的方法,通过onCreateDialog()方法初始化每个Dialog,并返回Dialog对象提供给showDialog()方法显示出来

@Override
protected Dialog onCreateDialog(int id) {
    Dialog dialog = null;
    switch (id) {
    case R.id.normal_btn:
        dialog = normalDialog();
        break;
    case R.id.menu_btn:
        dialog = menuDialog();
        break;
    case R.id.radio_btn:
        dialog = radioDialog();
        break;
    case R.id.multi_btn:
        dialog = multiDialog();
        break;
    case R.id.input_btn:
        dialog = inputDialog();
        break;
    default:
        break;
    }
    return dialog;
}

下面是常用对话框的具体实现,已经封装到方法中,相应的注释也已加上。为了装装B,使用了链式编程,看起来似乎好高大上,如果不知道链式编程是什么,那很好,我装B成功了,哈哈

标准对话框

private Dialog normalDialog() {
    // 生成一个警告对话框的构建器
    AlertDialog.Builder builder = new Builder(context);

    builder.setIcon(R.drawable.emoji_054);// 设置对话框的图标
    builder.setTitle("标准对话框");
    builder.setMessage("确定要支付吗");// 提示信息
    // 设置积极的按钮
    builder.setPositiveButton("确定", myClickListener);
    // 设置消极的按钮
    builder.setNegativeButton("取消", myClickListener);
    // 设置中间的按钮
    builder.setNeutralButton("摆设", myClickListener);

    // 优化
    return builder.create();
    // dialog.show();
}

/**
 * 监听器
 */
DialogInterface.OnClickListener myClickListener = new DialogInterface.OnClickListener() {
    // dialog:AlertDialog which:你点击了哪一个按钮
    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
        case -1:
            Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();
            break;
        case -2:
            Toast.makeText(context, "֧支付失败", Toast.LENGTH_SHORT).show();
            break;
        case -3:
            Toast.makeText(context, "对我就是֧摆设的", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
        }
    }
};

以下对话框使用到的数据是在strings.xml里定义的数组

<string-array name="hadleset">
    <item>小米</item>
    <item>魅族</item>
    <item>中兴</item>
    <item>华为</item>
    <item>联想</item>
</string-array>

菜单式对话框

private Dialog menuDialog() {
    // 通过资源包来获取数组资源
    final String[] items = getResources().getStringArray(R.array.hadleset);
    // 生成一个对话框的构建器
    AlertDialog.Builder builder = new Builder(context);
    // 链式编程
    return builder.setIcon(R.drawable.emoji_058)
            .setTitle("菜单式对话框")
            .setItems(R.array.hadleset,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int which) {
                        Toast.makeText(context, items[which],
                            Toast.LENGTH_SHORT).show();
                    }
                }).create();
                // .show();
    }

单选对话框

private int mWhich = 2;  //成员变量

private Dialog radioDialog() {
    // 通过资源包来获取数组资源
    final String[] items = getResources().getStringArray(R.array.hadleset);
    // 生成一个对话框的构建器
    AlertDialog.Builder builder = new Builder(context);
    // 链式编程
    return builder.setIcon(R.drawable.emoji_100)
                .setTitle("单选对话框")
                .setSingleChoiceItems(items, mWhich,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,int which) {
                            mWhich = which;
                        }
                    })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(context, items[mWhich],
                                Toast.LENGTH_SHORT).show();
                    }
                }).setNegativeButton("取消", null)
                .create();
             // .show();
    }

复选对话框

private Dialog multiDialog() {
    // 通过资源包来获取数组资源
    final String[] items = getResources().getStringArray(R.array.hadleset);
    // 生成一个对话框的构建器
    AlertDialog.Builder builder = new Builder(context);
    // 链式编程
    return builder.setIcon(R.drawable.emoji_058)
            // 设置对话框的图标
            .setTitle("复选对话框")
            // itemsId:复选项的资源id checkedItems:复选项的初始值(true|false),可以直接写null(表示全部没选中)
            .setMultiChoiceItems(R.array.hadleset,
                new boolean[] { true, true, false, false, false },
                new DialogInterface.OnMultiChoiceClickListener() {
                    // 当点击复选项时回调该方法
                    // dialog:AlertDialog;
                    // which:你点了哪个复选项,值是该复选项在数组中的position;
                    // isChecked:复选项的状态
                    public void onClick(DialogInterface dialog,int which, boolean isChecked) {
                        Toast.makeText(context,items[which] + isChecked,
                                Toast.LENGTH_SHORT).show();
                    }
                })
            .setPositiveButton(R.string.perform,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog,int which) {
                        // 当点击复选对话框确定按钮时,要显示
                        AlertDialog alertDialog = (AlertDialog) dialog;// 强转为警告对话框
                        ListView multiListView = alertDialog.getListView();// 取得复选对话框的列表视图
                        SparseBooleanArray selects = multiListView.getCheckedItemPositions();
                        StringBuffer sb = new StringBuffer();
                        int size = selects.size();
                        for (int i = 0; i < size; i++) {
                            // 假如SparseBooleanArray当前条目的value值为真
                            if (selects.valueAt(i)) {
                                // 取得复选项的position信息
                                int position = selects.keyAt(i);
                                String selectStr = multiListViewgetAdapter().getItem(position)
                                                .toString();
                                sb = sb.append(selectStr);
                            }
                        }
                        Toast.makeText(context, sb.toString(),Toast.LENGTH_SHORT).show();
                    }
                }).setNegativeButton(R.string.cancel, null)
                .create();
             // .show();
    }

自定义对话框就是自己写一个布局文件,然后把它塞进Dialog中去,再然后就响应相关的事件,and...好像可以了,嗯就是这样

自定义对话框

/**
 * 1、创建一个Dialog对象,并且设置对话框的主题(样式)
 * 2、设置对话框显示的视图界面
 * 3、对输入对话框的确定按钮添加点击监听,当点击该按钮后,输入用户输入的数据
 */
private Dialog inputDialog() {
    final Dialog dialog = new Dialog(context, android.R.style.Theme_Dialog);
    View view = getLayoutInflater().inflate(R.layout.input_dialog, null);
    final EditText dataEdit = (EditText) view.findViewById(R.id.edit);// 引用输入对话框布局的输入控件
    Button positive = (Button) view.findViewById(R.id.perfrom);// 引用输入对话框布局的确定按钮控件
    Button negative = (Button) view.findViewById(R.id.cancel);

    positive.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String inputData = dataEdit.getText().toString().trim();
            Toast.makeText(context, inputData, Toast.LENGTH_SHORT).show();
                dataEdit.setText("");
            dialog.dismiss();// 对话框在Activity中消失
        }
    });
    negative.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);// 无标题
    dialog.setContentView(view);// 设置对话框的内容视图
    return dialog;
    // dialog.show();

    }

其实现在的应用差不多都是用5.0后的Material Design来设计的了,它的视觉体验更好,更Android。而MD式的Dialog也是比5.0前好看好多好多,那为什么我没有用MD去写呢,因为我不会啊。

因为拖延症,我还没有去学呢
好吧我又找借口了,其实就是懒(心里默默地流泪)

希望对你们会有所帮助

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,443评论 25 707
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,706评论 22 664
  • 第一篇 读书笔记 数学,物理高中,大学重新来过一遍
    qwbouqd阅读 204评论 0 0
  • 第一次的心里触摸 眼神里泛起了秋波 想说的话太多太多 因为羞涩我没有说 离开你为何不快乐 夜晚的梦不停的播 为了你...
    安俊杰阅读 243评论 1 1