指定的孩子已经有一个父母。 您必须先调用子对象的父对象的removeView()

我有一个类来创build对话框和编码从中获取值。 它工作正常。 当我尝试第二次调用对话框时,它传递以下错误消息。

java.lang.IllegalStateException:指定的子项已经有一个父项。 您必须先调用子对象的父对象的removeView()。

你能告诉我如何删除removeView()?

这里是这个类的代码;

package com.util; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.widget.EditText; /** * helper for Prompt-Dialog creation */ public abstract class PromptDialog extends AlertDialog.Builder implements OnClickListener { private final EditText input; /** * @param context * @param title resource id * @param message resource id */ public PromptDialog(Context context, int title, int message) { super(context); setTitle(title); //:TODO Display msg only if not empty //setMessage(message); input = new EditText(context); setView(input); setPositiveButton("ok", this); setNegativeButton("cancel", this); } /** * will be called when "cancel" pressed. * closes the dialog. * can be overridden. * @param dialog */ public void onCancelClicked(DialogInterface dialog) { dialog.dismiss(); } @Override public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { if (onOkClicked(input.getText().toString())) { dialog.dismiss(); } } else { onCancelClicked(dialog); } } /** * called when "ok" pressed. * @param input * @return true, if the dialog should be closed. false, if not. */ abstract public boolean onOkClicked(String input); } 

这里是我调用类的实例的代码;

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final PromptDialog dlgName = new PromptDialog(this, R.string.enterName, R.string.enter_comment) { @Override public boolean onOkClicked(String input) { // do something mName = input; save(); //end do some thing return true; // true = close dialog } }; mTxtShiftName = (TextView) findViewById(R.id.shiftname); mTxtShiftName.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dlgName.show(); } }); 

我从我的片段的onCreateView()调用中调用错误的膨胀方法得到这个错误。

我通过改变它来修复它:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_saves, container); } 

对此:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_saves, container, false); } 

你应该把调用对话框构造函数的代码放在onCreateDialog(int)callback方法中而不是onCreate(Bundle) 。 在你的代码中,当你调用dlgName.show()时候,对话框会被隐含地初始化。 因此,当你第二次调用对话框,所以它是与对话框构造函数。

看一下这个:

http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int,android.view.ViewGroup,boolean)

具体来说,LayoutInflator的膨胀方法中的布尔参数和返回值:

返回充气层次结构的根视图。 如果提供了root并且attachToRoot为true,则这是root; 否则它是膨胀的XML文件的根。

 View dialogView = inflater.inflate(R.layout.brush_opts_dialog, rootView, false); 

你想让膨胀的视图的根是创build的视图,而不是“this”,这将是一个活动内的整个片段。