AlertDialog自定义View有关问题

我在写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,问题解决了。解决该问题可能还有其他方法,个人知识有限,欢迎大家来拍砖和指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值