AlertDialog

今天碰到了一個問題, 是關於點擊按鈕之後, 需要呈現AlertDialog所引發的錯誤.

情境是: 點擊button -> 呈現alertDialog -> 隱藏alertdialog -> 在點擊button -> shutdown

錯誤訊息是: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

這問題還滿少碰到的, 而且平常在Activity下使用都穩穩地, 但沒有想到在Fragment使用會發生這樣的問題

當然原因就如同 exception 一樣, alertdialog已經具備parentview了, 所以第二次建立就失敗

錯誤程式碼:

LayoutInflater inflater = LayoutInflater.from(getContext());;
        final View wifiHideView = inflater.inflate(R.layout.listview_item_wifi_hide, null);
        mWifiHideEditText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                AlertDialog.Builder wifiHideDialogBuilder = new AlertDialog.Builder(getContext());
                wifiHideDialogBuilder.setView(wifiHideView);
                wifiHideDialogBuilder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {

                        arg0.dismiss();
                    }
                });
                wifiHideDialogBuilder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {

                        arg0.dismiss();
                    }

                });
                wifiHideDialogBuilder.show();
            }
        });

正確程式碼:

mWifiHideEditText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LayoutInflater inflater = LayoutInflater.from(getContext());;
                View wifiHideView = inflater.inflate(R.layout.listview_item_wifi_hide, null);
                AlertDialog.Builder wifiHideDialogBuilder = new AlertDialog.Builder(getContext());
                wifiHideDialogBuilder.setView(wifiHideView);
                wifiHideDialogBuilder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {

                        arg0.dismiss();
                    }
                });
                wifiHideDialogBuilder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {

                        arg0.dismiss();
                    }

                });
                wifiHideDialogBuilder.show();
            }
        });

分析: 經過以上代碼, 會發現最大的差異處是在於 wifiHideView 的建構位置是不同的, 也就是說...

錯誤訊息描述的[The specified child already has a parent]指的並不是alertDialog, 而是 wifiHideView.

原本 wifiHideView 並沒有parent view,

因此第一次 setview 的時候, wifiHideView 的parentview被指向alertDialog,

因此在第二次要setview 的時候, wifiHideView 在此時已經有parentview了, 就爆出錯誤訊息了

results matching ""

    No results matching ""