java - 关闭对话框后再次打开对话框时应用程序崩溃,给出 'java.lang.IllegalStateException'

标签 java android layout-inflater illegalstateexception android-inflate

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

这是我如何夸大 View 的:

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;

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

请告诉我。

最佳答案

一个简单的解决方案是保留 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;

记住关闭对话框onDestroy方法以避免内存泄漏:

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

关于java - 关闭对话框后再次打开对话框时应用程序崩溃,给出 'java.lang.IllegalStateException',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39538296/

相关文章:

java - 如何导航到 JFileChooser 中的网络主机?

java - 如何从第二个 Controller 类中获取主 Controller 类中 textArea 中的选定文本?

android - 只有创建 View 层次结构的原始线程才能触及它的 View 。

android - 数字选择器在滚动/选择数字时抛出错误

java - 如何从充气编辑文本中读取值并将其放入 ArrayList 中

java - 命名空间声明的 XPath 解析

java - 在二进制字符串的左侧添加零 - Java

android - 如何在服务类的定时器内显示AlertDialog?

android - 最好在 Android 中膨胀或实例化控件?

android - 将 TextView 添加到 LinearLayout 时出现 ClassCastException