我有一個類來創建對話框和編碼以從中獲取值。它適用於一個。當我嘗試第二次調用對話框時,它傳遞以下錯誤消息。指定的孩子已經有父母。您必須首先調用子視圖的父級的removeView()
: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();
}
});
你在第二次嘗試時再次調用對話框構造函數嗎? – 2012-02-12 00:01:56
我使用的所有編碼都在我的問題中複製。我認爲這可能是原因。但我不知道如何避免這種情況? – SAN 2012-02-12 00:22:21
單擊按鈕時不要調用構造函數兩次。在onCreate中使用Dialog構造函數或onPrepareDailog使用代碼創建對話框,然後在想要顯示時調用dialog.show()。 – 2012-02-12 00:25:22