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);
    }
});

這里是創建一個布局文件,當然也可以直接定義控件,但是要注意布局的美觀就可以了。

如何創建對話框
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容