【问题标题】:App crashing giving 'java.lang.IllegalStateException' when opening a dialog again after closing it关闭对话框后再次打开对话框时应用程序崩溃并给出“java.lang.IllegalStateException”
【发布时间】:2016-09-16 18:47:58
【问题描述】:

我有一个对话框,我应该在EditText 中填写一些详细信息。如果在编辑文本为空时单击肯定按钮,则会显示带有消息的 Snackbar 并关闭对话框。但是,当我再次打开对话框时,应用程序崩溃了:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first 错误。

我是这样夸大视图的:

LayoutInflater inflater = this.getLayoutInflater();
addVenueDialog = inflater.inflate(R.layout.add_venue_dialog, null);

这是打开对话框并检查编辑文本是否为空的java代码:

case R.id.nav_add_venue:
            if (dialog == null) {

                LayoutInflater inflater = this.getLayoutInflater();
                View addVenueDialog = inflater.inflate(R.layout.add_venue_dialog, null);

                vName = (EditText) addVenueDialog.findViewById(R.id.vName);
                vAddress = (EditText) addVenueDialog.findViewById(R.id.vAddress);

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("Title");
                builder.setView(addVenueDialog);
                builder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        if (isNetworkAvailable()) {
                            if (vName.getText().toString().isEmpty()) {
                                Snackbar snackbar = Snackbar
                                        .make(coordinatorLayout, "V name cannot be empty", Snackbar.LENGTH_SHORT);
                                snackbar.show();
                            } else if (vAddress.getText().toString().isEmpty()) {
                                Snackbar snackbar = Snackbar
                                        .make(coordinatorLayout, "V address cannot be empty", Snackbar.LENGTH_SHORT);
                                snackbar.show();
                            } else {
                                mDatabase.child("vs").child(user.getUid()).child("V name").setValue(vName.getText().toString());
                                mDatabase.child("vs").child(user.getUid()).child("V address").setValue(vAddress.getText().toString());
                            }
                        } else {
                            Snackbar snackbar = Snackbar
                                    .make(coordinatorLayout, "No internet connection", Snackbar.LENGTH_SHORT);
                            snackbar.show();
                        }
                    }
                });
                dialog = builder.create();
            }
            dialog.show();
            break;

关闭后再次打开对话框时,我不知道为什么应用程序崩溃。

请告诉我。

【问题讨论】:

  • 崩溃是因为,如错误消息中所示,您正在添加已在别处添加的视图。即,在第一次创建警报对话框时。当您像这样重新创建对话框时,您不能简单地重新添加您的视图。
  • @njzk2 那么,解决方案是什么?

标签: java android layout-inflater illegalstateexception android-inflate


【解决方案1】:

一个简单的解决方案是保留AlertDialog 的全局实例并重新使用它:

//global
private AlertDialog dialog;

现在在开关盒中:

case R.id.nav_add_venue:
    if(dialog == null) {
        LayoutInflater inflater = this.getLayoutInflater(); 
        View addVenueDialog = inflater.inflate(R.layout.add_venue_dialog, null); 

        builder.setView(addVenueDialog); 

        final EditText vName = (EditText) addVenueDialog.findViewById(R.id.vName); 
        final EditText vAddress = (EditText) addVenueDialog.findViewById(R.id.vAddress); 

        // Other code //
        dialog = builder.create();
     }
     dialog.show();
     break;

记得dismiss对话框onDestroy方法避免内存泄漏:

public void onDestroy() {
   super.onDestroy();
   if(dialog != null) {
     dialog.dismiss();
   }
 }

【讨论】:

  • 将布局膨胀任务放在if 语句中。所有对话框创建任务都应该在里面。
  • 您是否在其他地方使用此视图addVenueDialog?你不应该使用它。所以试着把它作为一个局部变量。此外,应相应地引用vName 或其他子视图。
  • @HammadNasir,如果这个或任何答案已经解决了您的问题,请考虑accepting it,点击复选标记并投票。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。顺便说一句,没有义务这样做。
  • 你也可以看看这个:stackoverflow.com/questions/39520105/… ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多