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

飄渺雲軒發表於2016-12-20

對話方塊在Android中的應用場景也是很多的,例如刪除、支付等重要的操作,需要提醒使用者是否繼續,這樣很好的提高了使用者的體驗

這裡總結了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去寫呢,因為我不會啊。

因為拖延症,我還沒有去學呢
好吧我又找藉口了,其實就是懶(心裡默默地流淚)

希望對你們會有所幫助

相關文章