先看异常:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first.
我在使用alertdialog 时,通过 setview 方法来给alertdialog设置view 如下代码:
new AlertDialog.Builder(this)
.setView(alertView)
.setPositiveButton(" 去获取 ", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
startActivity(new Intent(MsgTemplateActivity.this,AboutActivity.class));
}
})
.setNegativeButton("继续委屈自己", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
运行第一次没问题 一切正常,但当关闭dialog后,第二次点击按钮使dialog弹出时 ,就会报这个异常!
其中,alertview 是通过layoutinflater.inflate 得到的view
alertView = LayoutInflater.from(this).inflate(R.layout.alert_dialog_layout, null, false);
原因:
任何一个view组件只有一个parent组件,且view组件加入parent组件通过addView方法只能加一次。那么当我第二次创建AlertDialog组件并使用相同的setView方法把一个alertView添加进去的时候,其实这个alertView组件已经有parent组件了。所以会报错了.
解决办法:
我们退出AlertDialog对话框时候的事件响应代码中将这个alertView组件从AlertDialog中删除,使得alertView组件成为一个独立的组件。 只需在setview 之前添加如下代码:
if (alertView.getParent() != null) {
((ViewGroup) alertView.getParent()).removeAllViews();
}
修改后的代码:
if (alertView.getParent() != null) {
((ViewGroup) alertView.getParent()).removeAllViews();
}
new AlertDialog.Builder(this)
.setView(alertView)
.setPositiveButton(" 去获取 ", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
startActivity(new Intent(MsgTemplateActivity.this, AboutActivity.class));
}
})
.setNegativeButton("继续委屈自己", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
问题解决。
总结:
特定的子view已经有一个父view了,你必须先在父view中调用removeView()函数才能在其他把它设为其他view的子view。所以当遇到这种异常时 ,冷静找到出问题的view,找到它的父亲,然后removeview ,就可以了。