Android複習之旅--簡單使用Dialog

對話框在Android中的應用場景也是不少的,例如刪除、支付等重要的操做,須要提醒用戶是否繼續,這樣很好的提升了用戶的體驗javascript

這裏總結了Android中經常使用的對話框,雖然只是舊版本的,但當作參考也差很少足夠了java

對話框是提示用戶做出決定或輸入額外信息的小窗口。 對話框不會填充屏幕,一般用於須要用戶採起行動才能繼續執行的模式事件android

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,哈哈,好尷尬啊app

@Override
public void onClick(View v) {
    // 優化
    showDialog(v.getId());
}複製代碼

重載父類的方法,經過onCreateDialog()方法初始化每一個Dialog,並返回Dialog對象提供給showDialog()方法顯示出來ide

@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...好像能夠了,嗯就是這樣

自定義對話框

/** * 一、建立一個Dialog對象,而且設置對話框的主題(樣式) * 二、設置對話框顯示的視圖界面 * 三、對輸入對話框的肯定按鈕添加點擊監聽,當點擊該按鈕後,輸入用戶輸入的數據 */
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去寫呢,由於我不會啊。

由於拖延症,我尚未去學呢
好吧我又找藉口了,其實就是懶(內心默默地流淚)

但願對大家會有所幫助

相關文章
相關標籤/搜索