我知道有幾十個問題會問這個錯誤,但是沒有一個提出的解決方案似乎適用於我的問題,至少我知道。Android - 指定的孩子已經有父母。你必須先調用孩子父母的removeView()
這裏是我的日誌:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
at android.view.ViewGroup.addView(ViewGroup.java:1871)
at android.view.ViewGroup.addView(ViewGroup.java:1851)
at com.android.internal.app.AlertController.setupView(AlertController.java:365)
at com.android.internal.app.AlertController.installContent(AlertController.java:206)
at android.app.AlertDialog.onCreate(AlertDialog.java:251)
at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
at android.app.Dialog.show(Dialog.java:225)
at com.company.MyApp.MyActivity$7.onItemClick(MyActivity.java:240)
at android.widget.AdapterView.performItemClick(AdapterView.java:284)
at android.widget.ListView.performItemClick(ListView.java:3513)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
這裏是MyActivity.java的onCreate()。你可以看到一個Dialog Builder被顯示並給出了一些值。無論myDialogLayout
和myDialogBuilder
是私有類成員
@Override
public void onCreate(Bundle savedInstanceState)
{
// ... a bunch of init code...
// Create a dialog builder
myDialogLayout = getLayoutInflater().inflate(R.layout.leaving, null);
myDialogBuilder = new AlertDialog.Builder(this)
.setTitle("My Title")
.setView(myDialogLayout)
.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which) {}
});
// ... more code ...
}
後來,當某個按鈕被點擊我的活動中,myDialogBuilder
定製了一下,然後創建一個對話框並顯示。 myDialog
是私有類變量/成員:
// Builder customized a bit
myDialogBuilder
.setMessage("custom message here");
// Dialog created from Builder
myDialog = myDialogBuilder.create();
// Dialog shown
myDialog.show(); // <---- MyActivity.java Line: 240
所以,在我的問題,當我點擊我的按鈕,創建成功的對話框。但是當我按下對話框上的取消並再次按下按鈕後,我看到日誌中顯示的錯誤。出於某種原因,該活動不希望我重用我的myDialog
對話框。它是一個班級成員,因此可以從onClick
處理程序訪問它。而且每次單擊該按鈕時,myDialog
都是一個新的對話框,因爲它每次都是從頭開始創建的myDialogBuilder.create()
。
任何人都知道問題是什麼?我也嘗試在按下「取消」按鈕時添加myDialog.dismiss()
,但這沒有什麼區別。
此外,您可以在我的myDialogBuilder
中看到自定義XML佈局用於對話框的視圖。根據錯誤消息,它聽起來像是希望我使用removeView()
以刪除在對話框中使用的視圖。但myDialogBuilder.removeView()
不是一個有效的方法。
這是關鍵。我將'myDialogLayout'從一個類成員變量中移除,並將其放在'onClick'處理程序方法的本地。那樣的話,這是一種每次都會膨脹的新佈局。謝謝! – 2012-02-06 22:04:18