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了, 就爆出錯誤訊息了