java.lang.IllegalStateException: The specified child already has a parent. 异常处理

先看异常:

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 ,就可以了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值