android dialog -指定的子对象已经有父对象,必须首先在子对象的父对象上调用removeView()

pgccezyw  于 2023-04-04  发布在  Android
关注(0)|答案(5)|浏览(136)

经过检查,要求用户打开互联网服务,我试图点击一个按钮,我的应用程序崩溃的错误消息

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

在这一行它崩溃,我已经尝试这样做,但没有解决绝对

if(alert.getContext() != null){
            alert.show();
        }

这是完整的代码

else if (id == R.id.xyz) {

            //startActivity(borrowIntent);
            AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
            alert.setTitle("xyz");
            input.setFilters(new InputFilter[] {
                    // Maximum 2 characters.
                    new InputFilter.LengthFilter(6),
                    // Digits only.
                    DigitsKeyListener.getInstance(), 
                });
            // Digits only & use numeric soft-keyboard.
            input.setKeyListener(DigitsKeyListener.getInstance());
            input.setHint("xyz");
            alert.setView(input);
            alert.setPositiveButton("Borrow", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                if(input.getText().length() == 0)
                {
                    input.setError("xyz is required !");
                }
                else
                {

                   if(isNetworkAvailable())
                      {
                         xyz( input.getText().toString());

                      }else{

                            //setContentView(R.layout.main);

                            AlertDialog.Builder builder = new AlertDialog.Builder(
                                    MainActivity.this);
                              builder.setCancelable(false);
                              builder.setTitle("xyz");
                              builder.setMessage("Please enable wifi services");
                              builder.setInverseBackgroundForced(true);
                              builder.setPositiveButton("Ok",
                                      new DialogInterface.OnClickListener() {
                                          @Override
                                          public void onClick(DialogInterface dialog,
                                                  int which) {

                                              startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0);
                                              dialog.dismiss();

                                          }
                                      });
                              AlertDialog alerts = builder.create();
                              alerts.show();
                           }//end of block

                        }
              }
            });
            alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int whichButton) {
                // Canceled.
              }
            });
            if(alert.getContext() != null){
            alert.show(); //crashes at this line
            }
        }

拜托,我错过了什么?

798qvoo8

798qvoo81#

问题出在这一行:alert.setView(input);您添加的inputView已经有parent。创建新的input示例。

66bbxpm5

66bbxpm52#

根据这个post,添加这个检查以从其父节点中删除输入并重新读取它:

if(input.getParent()!=null)
        ((ViewGroup)input.getParent()).removeView(input); // <- fix
    alert.addView(input);
np8igboo

np8igboo3#

放置以下行

final AlertDialog alertd = alert.create();

之后

AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
rbpvctlc

rbpvctlc4#

以下情况也可能发生(发生在我身上):
有时当你使用一个列表视图时,你会用一个适配器初始化它,它属于某个布局。现在让我们假设这个布局文件的根视图是一个id为“root_view”的<LinearLayout>
如果您现在在activity中注册上下文菜单并创建一个AlerdDialog.Builder,它在选择某个菜单元素后出现,并使用布局文件对其进行初始化,该布局文件也有一个ID为“root_view”的根元素,其中所有属于您的AlertDialog的元素都是它的子元素,那么这些元素“将不会被找到”。您将无法使用findViewById访问这些元素,相反,您只能从列表视图的<LinearLayout>中访问元素,并且在调用builder.show()的行中得到相同的错误消息(或者在这里是alert.show())。
因此,通常情况下,为您的项目唯一地命名布局文件中元素的id是一个好主意。

myzjeezk

myzjeezk5#

我忘记在AlertDialog.Builder上调用create()。当你调用show()而不调用create()方法时,AlertDialog示例被创建。这在第一次成功了,但随后的点击得到了IllegalStateException。当我在我的onClickListener内部调用show()时,它将在每次单击按钮时创建一个新的AlertDialog示例。

相关问题