У указанного ребенка уже есть родитель. Сначала вы должны вызвать 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();
}
});
Ответы
Ответ 1
Я получил эту ошибку от вызова неправильного метода вздутия в моем вызове 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);
}
Ответ 2
Вы должны поместить код, вызывающий конструктор диалога, внутри метода обратного вызова onCreateDialog(int)
вместо onCreate(Bundle)
. В вашем коде диалоговое окно инициализируется неявно, когда вы вызываете dlgName.show()
. В результате, когда вы вызываете диалог во второй раз, так и с конструктором диалога.
Ответ 3
Проверьте это:
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);
Вы хотите, чтобы зарождаемый корень представления представлял собой созданный вид, а не "this", который был бы целым фрагментом внутри действия.