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

来源:互联网 发布:excel拆分数据公式 编辑:程序博客网 时间:2024/05/29 21:30
今天实现了一个自定义对话框,当点击相应按钮时弹出该对话框。在测试过程中发现,第一次点击按钮时,对话框可以正常出现,但是在点击对话框上的“确定”或“取消”按钮回到主界面后,再次点击按钮,会报错如下:

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

出错处的代码为:

[java] view plaincopy
  1. add.setOnClickListener(new View.OnClickListener() {  
  2.             public void onClick(View v) {  
  3.                 builder.setTitle("请输入新建相册名");  
  4.                 builder.setView(linearLayout);  
  5.                 builder.setPositiveButton("确定",  
  6.                         new DialogInterface.OnClickListener() {  
  7.                             public void onClick(DialogInterface dialog,  
  8.                                     int which) {  
  9.                                 albumName = (EditText) linearLayout  
  10.                                         .findViewById(R.id.addname);  
  11.                                 String name = albumName.getText().toString();  
  12.                                 System.out.println("用户输入的相册名:" + name);  
  13.                             }  
  14.                         });  
  15.                 builder.setNegativeButton("取消",  
  16.                         new DialogInterface.OnClickListener() {  
  17.   
  18.                             public void onClick(DialogInterface dialog,  
  19.                                     int which) {  
  20.                                 // TODO Auto-generated method stub  
  21.   
  22.                             }  
  23.                         });  
  24.                 builder.create().show();    
  25.             }  
  26.         });  
在以上出错代码builder.setView(linearLayout)中,子视图是自定义的linearLayout,父视图是builder。而提示的大致意思是说为一个子视图指定了多个父视图。由此可以推断出,在第二次点击按钮弹出对话框时,子视图与第一次点击时的子视图是同一个对象,而父视图已经不再是同一个对象了。

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

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

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

原文:http://blog.csdn.net/lissdy/article/details/8453433
0 0
原创粉丝点击