AlertDialog-The 指定 child 已经有一个 parent
AlertDialog-The specified child already has a parent
当我尝试在 ImageViews
(iView
和 iView2
) 中添加 alertDialog.show()
时,我的代码崩溃并给出
The specified child already has a parent. You must call removeView()
on the child's parent first.
我不知道为什么会这样。其实我读到了这个错误信息,可能给了使用 2 次 alertDialog.show()
有什么建议吗?
mLayout = (RelativeLayout) findViewById(R.id.relaLayout);
final EditText input = new EditText(MainActivity.this);
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT
,LinearLayout.LayoutParams.MATCH_PARENT);
iView
input.setLayoutParams(lp);
iView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
select = 0;
alertDialog.setView(input);
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
m_Text = input.getText().toString();
mLayout.addView(cth[0].setCardView(select, m_Text));
iView.setClickable(false);
}
});
alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.show();
}
});
iView2
iView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
select = 1;
//input.setLayoutParams(lp);
alertDialog.setView(input);
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
m_Text = input.getText().toString();
mLayout.addView(cth[0].setCardView(select, m_Text));
iView2.setClickable(false);
}
});
alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.show();
}
});
如果我评论 alertDialog.show() 那么它可以工作,但我需要它
查看一些源代码,您似乎正在将相同的视图实例(EditText "input")分配给警报对话框。每次调用 show()
方法时,都会通过 create()
创建对话框。然后将提供给 setView()
的视图添加到生成的对话框布局中。由于该视图已添加到布局中,因此它现在具有父级(对话框布局)。在再次显示对话框之前,您必须从父视图 (AlertDialog) 中删除视图,或者实例化一个新视图。
只需移动将 EditText
实例化到侦听器内部的行(并删除 final 修饰符,在此范围内不需要它)即可解决我的问题。 (我能够重现)
iView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
// Create the edit text view.
EditText input = new EditText(MainActivity.this);
// Set it.
alertDialog.setView(input);
// Set it.
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
m_Text = input.getText().toString();
mLayout.addView(cth[0].setCardView(select, m_Text));
v.setClickable(false);
}
});
// Set it.
alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
// Show it.
alertDialog.show();
});
当我尝试在 ImageViews
(iView
和 iView2
) 中添加 alertDialog.show()
时,我的代码崩溃并给出
The specified child already has a parent. You must call
removeView()
on the child's parent first.
我不知道为什么会这样。其实我读到了这个错误信息,可能给了使用 2 次 alertDialog.show()
有什么建议吗?
mLayout = (RelativeLayout) findViewById(R.id.relaLayout);
final EditText input = new EditText(MainActivity.this);
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT
,LinearLayout.LayoutParams.MATCH_PARENT);
iView
input.setLayoutParams(lp);
iView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
select = 0;
alertDialog.setView(input);
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
m_Text = input.getText().toString();
mLayout.addView(cth[0].setCardView(select, m_Text));
iView.setClickable(false);
}
});
alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.show();
}
});
iView2
iView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
select = 1;
//input.setLayoutParams(lp);
alertDialog.setView(input);
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
m_Text = input.getText().toString();
mLayout.addView(cth[0].setCardView(select, m_Text));
iView2.setClickable(false);
}
});
alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.show();
}
});
如果我评论 alertDialog.show() 那么它可以工作,但我需要它
查看一些源代码,您似乎正在将相同的视图实例(EditText "input")分配给警报对话框。每次调用 show()
方法时,都会通过 create()
创建对话框。然后将提供给 setView()
的视图添加到生成的对话框布局中。由于该视图已添加到布局中,因此它现在具有父级(对话框布局)。在再次显示对话框之前,您必须从父视图 (AlertDialog) 中删除视图,或者实例化一个新视图。
只需移动将 EditText
实例化到侦听器内部的行(并删除 final 修饰符,在此范围内不需要它)即可解决我的问题。 (我能够重现)
iView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
// Create the edit text view.
EditText input = new EditText(MainActivity.this);
// Set it.
alertDialog.setView(input);
// Set it.
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
m_Text = input.getText().toString();
mLayout.addView(cth[0].setCardView(select, m_Text));
v.setClickable(false);
}
});
// Set it.
alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
// Show it.
alertDialog.show();
});