我在写AlertDialog创建自定义对话框时遇到了一个棘手的问题,所报错误:java.lang.IllegalStateException: The specified child already has a parent. 经过在网上搜罗一些资料,并稍作整理一下,在此做个总结笔记。
直接上代码:
所添加的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal">
<TextView
android:layout_marginLeft="20dp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="用户名:"
android:textSize="20sp"/>
<EditText
android:id="@+id/edit_name"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content"
android:hint="请输入用户名"/>
</LinearLayout>
<LinearLayout
android:layout_gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="20dp">
<TextView
android:layout_marginLeft="20dp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="密码:"
android:textSize="20sp"/>
<EditText
android:id="@+id/edit_pwd"
android:password="true"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="请输入密码"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center">
<Button
android:id="@+id/save_btn"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="保存"/>
<Button
android:id="@+id/cancel_btn"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="取消"/>
</LinearLayout>
</LinearLayout>
仅仅是一个登陆页面。
主布局里只有一个Button,此处不再贴代码。
Activity中代码如下:
package com.example.androidtest;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SecondActivity extends Activity implements OnClickListener {
private Button btn;
private AlertDialog.Builder builder;
private AlertDialog dialog;
private Button btnSave, btnCancel;
private View v;
private LayoutInflater mInflater;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_view);
//要开启对话框的按钮
btn = (Button) findViewById(R.id.dialog_show);
//获得所要添加的布局
mInflater = LayoutInflater.from(this);
v = mInflater.inflate(R.layout.show_dialog, null);
//获得布局中的控件
btnSave = (Button) v.findViewById(R.id.save_btn);
btnCancel = (Button) v.findViewById(R.id.cancel_btn);
//注册监听
btnSave.setOnClickListener(SecondActivity.this);
btnCancel.setOnClickListener(SecondActivity.this);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.dialog_show:
builder = new AlertDialog.Builder(SecondActivity.this);
builder.setView(v);
builder.create();
dialog = builder.show();
break;
case R.id.save_btn:
dialog.dismiss();
break;
case R.id.cancel_btn:
dialog.dismiss();
break;
}
}
}
运行成功,点击一次“弹出对话框按钮”成功,当取消AlertDialog后,再次点击该按钮。结果出来了。java.lang.IllegalStateException: The specified child already has a parent.
因为setView中的View是LayoutInflater 获取过来的,第二次的时候这个View还被占用,应该重新setView一次,或者删除该View,再重新加载。问题找到了,那么下面更改一下方法
。。。。。。。
@Override
public void onClick(View view) {
// 获得所要添加的布局
**mInflater = LayoutInflater.from(this);
v = mInflater.inflate(R.layout.show_dialog, null);
// 获得布局中的控件
btnSave = (Button) v.findViewById(R.id.save_btn);
btnCancel = (Button) v.findViewById(R.id.cancel_btn);
// 注册监听
btnSave.setOnClickListener(SecondActivity.this);
btnCancel.setOnClickListener(SecondActivity.this)**;
switch (view.getId()) {
case R.id.dialog_show:
builder = new AlertDialog.Builder(SecondActivity.this);
builder.setView(v);
builder.create();
dialog = builder.show();
break;
case R.id.save_btn:
dialog.dismiss();
break;
case R.id.cancel_btn:
dialog.dismiss();
break;
}
}
。。。。。。
每次点击”弹出对话框“按钮,都会显示正常。OK,问题解决了。解决该问题可能还有其他方法,个人知识有限,欢迎大家来拍砖和指导。