Android 如何创建对话框

前言

Android中对话框的展示,对人机交互有着重要的意义,常见的对话框包括:

  • 警告对话框
  • 进度对话框
  • 日期选择对话框
  • 时间选择对话框
  • 普通列表对话框
  • 单选列表对话框
  • 多选列表对话框
  • 带图标的列表对话框
  • 自定义对话框

下面对这些对话框的使用进行说明:

警告对话框

private void showAlertDialog() {
        //使用兼容包 android.support.v7.app.AlertDialog;
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("提示");
        builder.setIcon(R.mipmap.ic_launcher);
        builder.setMessage("您有一笔2千万的汇款在处理,请问是您亲自操作的吗?");
        builder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Log.d(TAG, "onClick: " + i);
                toast(R.string.confirm);
            }
        });
        builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
                toast(R.string.cancel);
            }
        });
        builder.setNeutralButton(R.string.exit, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Log.d(TAG, "onClick: " + i);
                toast(R.string.exit);
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
}

进度对话框

private void showPgsDialog() {
        final ProgressDialog dialog = new ProgressDialog(this);
        dialog.setTitle("下载提示");
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMax(100);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.background), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        dialog.onStart();
        new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 10;
                while (i <= 100) {
                    try {
                        Thread.sleep(100);
                        dialog.incrementProgressBy(1);
                        i++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                dialog.dismiss();
            }
        }).start();
        dialog.show();
}

日期选择对话框

private void showDatePickerDialog() {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog dialog = new MyDatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
                Log.d(TAG, "onDateSet: " + year + "." + (monthOfYear + 1) + "." + dayOfMonth);
                String date = String.format(Locale.CHINESE, "%04d.%02d.%02d", year, monthOfYear + 1, dayOfMonth);
                btDate.setText(date);
            }
        }, year, month, day);
        dialog.show();
}

在构造DatePickerDialog的时候需要传入初始化的year,month,day,monthOfYear是从0开始的,所以得到的月份要记得加1。

时间选择对话框

private void showTimePickerDialog() {
        Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        TimePickerDialog dialog = new MyTimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {
                Log.d(TAG, "onTimeSet: " + hourOfDay + ":" + minute);
                String time = String.format(Locale.CHINESE, "%02d:%02d", hourOfDay, minute);
                btTime.setText(time);
            }
        }, hour, minute, true);
        dialog.show();
}

在构造TimePickerDialog时要传入初始化的hour和minute,第五个参数是布尔型变量,是否是24小时制,传入true设置24小时制,反之亦然。

注意:
在使用DatePickerDialog和TimePickerDialog时,要解决兼容性的问题,在回调onDateSet时,4.3系统后会回调两次,而4.3以下的则回调一次,这样很影响业务逻辑,要解决这个问题,需要重写DatePickerDialog的onStop方法,将super.onStop()方法去掉即可。详细可参考http://blog.csdn.net/wxuande/article/details/44002791

public class MyDatePickerDialog extends DatePickerDialog {

    public MyDatePickerDialog(Context context, OnDateSetListener listener, int year, int month, int dayOfMonth) {
        super(context, listener, year, month, dayOfMonth);
    }

    public MyDatePickerDialog(Context context, int themeResId, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth) {
        super(context, themeResId, listener, year, monthOfYear, dayOfMonth);
    }

    //解决兼容性问题,即onDateSet方法回调两次的bug
    @Override
    protected void onStop() {

    }
}

普通列表对话框

//核心方法
builder.setItems(arrayColor, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        Log.d(TAG, "onClick: " + arrayColor[i]);
        toast("你选择的是:" + arrayColor[i]);
    }
});

单选列表对话框

//核心方法
builder.setSingleChoiceItems(arrayGender, -1, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(final DialogInterface dialogInterface, int i) {
        Log.d(TAG, "onClick: " + arrayGender[i]);
        toast("你选择的是:" + arrayGender[i]);
    }
});

setSingleChoiceItems的第二个参数是item的index,-1表示不预先选择,0表示选择第一项,以此类推。

多选列表对话框

//核心方法
final boolean[] pos = new boolean[arrayFruits.length];
builder.setMultiChoiceItems(arrayFruits, null, new DialogInterface.OnMultiChoiceClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i, boolean b) {
        pos[i] = b;
    }
});
builder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int which) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0, length = pos.length; i < length; i++) {
            if (pos[i]) {
                sb.append(arrayFruits[i]);
                sb.append("、");
            }
        }
        Log.d(TAG, "onClick: " + sb.deleteCharAt(sb.length() - 1).toString());
        toast("你选择的是:" + sb.deleteCharAt(sb.length() - 1).toString());
    }
});

setMultiChoiceItems的第二个参数表示的是被选中的item,null表示不设默认值。

带图标的列表对话框

//核心方法
builder.setAdapter(new ListItemAdapter(), new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        toast("你选择的是:" + arrayColor[which]);
    }
});
private class ListItemAdapter extends BaseAdapter {

    int[] imgIds = {R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher};

    @Override
    public int getCount() {
        return imgIds.length;
    }

    @Override
    public Integer getItem(int position) {
        return imgIds[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView = new TextView(MainActivity.this);
        textView.setText(getResources().getStringArray(R.array.colors)[position]);
        textView.setTextSize(24);
        AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(
                AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT
        );
        textView.setGravity(Gravity.CENTER_VERTICAL);
        textView.setLayoutParams(layoutParams);
        textView.setCompoundDrawablesWithIntrinsicBounds(getItem(position), 0, 0, 0);
        textView.setPadding(40, 0, 40, 0);
        textView.setCompoundDrawablePadding(8);
        return textView;
    }
}

自定义对话框

//核心方法
final View root = LayoutInflater.from(this).inflate(R.layout.dialog_login, null);
builder.setView(root);
builder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String name = ((EditText) root.findViewById(R.id.et_name)).getText().toString();
        String pwd = ((EditText) root.findViewById(R.id.et_pwd)).getText().toString();
        if (TextUtils.isEmpty(name)) {
            toast("账号不能为空");
            return;
        }
        if (TextUtils.isEmpty(pwd)) {
            toast("密码不能为空");
            return;
        }
        toast("账号:" + name + ", 密码:" + pwd);
    }
});

这里是创建一个布局文件,当然也可以直接定义控件,但是要注意布局的美观就可以了。

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

推荐阅读更多精彩内容