AlertDialog二次点击报You must call removeView() on the child's parent first错的解决方法

今天在工作中用到了自定义的Dialog,理想总是很美好的,因为在自定义Dialog和创建Dialog的过程比想象的要顺利,所呈现的效果和想象中的一致,但是正当自己沾沾自喜的时候,在第一次点击弹出Dialog之后,第二次点击程序却闪退了。一开始的喜悦瞬间消失了,痛定思痛,查看LogCat发现报错java.lang.IllegalStateException The specified child already has a parent. You must call removeView() on the child's parent first。

报错前的代码是:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LayoutInflater myInflater = LayoutInflater.from(CameraSubstitute.this); selfDialog = (LinearLayout) myInflater.inflate(R.layout.custom_dialog, null); dialog = new AlertDialog.Builder(CameraSubstitute.this); dialog.setTitle("参数设置"); dialog.setView(selfDialog); dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); }

把dialog的创建写在onCreate()方法中,因为我的view设置的为全局变量,在第一次创建对话框的时候,已经绑定了一个builder(也就是上次所说的Parent对象),所以在第二次点击对话框的时候,再次绑定builder的时候,新的builder就不会接收我们自定义的view,因为它认为你已经绑定过了,此时就算你将之前的builder在对话框消受的同时销毁掉也是没用的,因为我们的view仍然会有绑定的过往记录。

而正确的写法为:

button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { LayoutInflater myInflater = LayoutInflater.from(CameraSubstitute.this); selfDialog = (LinearLayout) myInflater.inflate(R.layout.custom_dialog, null); dialog = new AlertDialog.Builder(CameraSubstitute.this); dialog.setTitle("参数设置"); dialog.setView(selfDialog); dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } });}

要把Dialog的创建写在按钮的onClick事件里。

你可能感兴趣的:(Android学习心得)