Android使用自定义对话框报错:The specified child already has a parent. You must call removeView() on the...

今天实现了一个自定义对话框,当点击相应按钮时弹出该对话框。在测试过程中发现,第一次点击按钮时,对话框可以正常出现,但是在点击对话框上的“确定”或“取消”按钮回到主界面后,再次点击按钮,会报错如下:

E/AndroidRuntime(26211): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

出错处的代码为:

add.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				builder.setTitle("请输入新建相册名");
				builder.setView(linearLayout);
				builder.setPositiveButton("确定",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog,
									int which) {
								albumName = (EditText) linearLayout
										.findViewById(R.id.addname);
								String name = albumName.getText().toString();
								System.out.println("用户输入的相册名:" + name);
							}
						});
				builder.setNegativeButton("取消",
						new DialogInterface.OnClickListener() {

							public void onClick(DialogInterface dialog,
									int which) {
								// TODO Auto-generated method stub

							}
						});
				builder.create().show();  
			}
		});
在以上出错代码builder.setView(linearLayout)中,子视图是自定义的linearLayout,父视图是builder。而提示的大致意思是说为一个子视图指定了多个父视图。由此可以推断出,在第二次点击按钮弹出对话框时,子视图与第一次点击时的子视图是同一个对象,而父视图已经不再是同一个对象了。

查看代码发现,linearLayout对象是我在oncreate()方法中获得的:

linearLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.dialogname, null);
所以在第二次点击按钮弹出对话框时,子视图还是之前那个在oncreate()方法中获取的、、
查明真相之后,只需在监听方法中加上获取linearLayout的语句即可:

linearLayout = (LinearLayout)getLayoutInflater().inflate(R.layout.dialogname, null);
builder.setTitle("请输入新建相册名"); 
builder.setView(linearLayout); ......
之后测试,一切正常啦!!!





  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值