如何从AlertDialog Android中移除视图

3

我正在制作一个带有自定义EditText字段的警示对话框。

我创建了一个View变量,并将其与我的自定义EditText字段关联起来。

requestView = inflater.inflate(R.layout.send_request,null);

然后我将那个视图添加到我的AlertDialog中。

alert.setView(requestView);

然后我给我的按钮添加了onClick方法来执行弹出对话框的操作。

chatRequestbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                alert.setPositiveButton("Send", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        request = requestMsg.getText().toString();

                        send();

                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();

                    }
                });

                alert.show();

            }
        });

它之前运行正常。但在警告对话框上按下取消选项后,当我再次按下按钮执行警告对话框选项时。

它会崩溃并显示以下错误。

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
                                                                           at android.view.ViewGroup.addViewInner(ViewGroup.java:4417)
                                                                           at android.view.ViewGroup.addView(ViewGroup.java:4258)
                                                                           at android.view.ViewGroup.addView(ViewGroup.java:4230)
                                                                           at android.support.v7.app.AlertController.setupCustomContent(AlertController.java:647)
                                                                           at android.support.v7.app.AlertController.setupView(AlertController.java:463)
                                                                           at android.support.v7.app.AlertController.installContent(AlertController.java:226)
                                                                           at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:257)
                                                                           at android.app.Dialog.dispatchOnCreate(Dialog.java:395)
                                                                           at android.app.Dialog.show(Dialog.java:294)
                                                                           at android.support.v7.app.AlertDialog$Builder.show(AlertDialog.java:955)
                                                                           at com.buckydroid.anonchat.User$3.onClick(User.java:86)
                                                                           at android.view.View.performClick(View.java:5637)
                                                                           at android.view.View$PerformClick.run(View.java:22433)
                                                                           at android.os.Handler.handleCallback(Handler.java:751)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6126)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

我认为在点击按钮时将视图设置为空并再次添加视图可以解决问题。但问题一次又一次地出现...


你能提供一段代码示例来展示如何创建和显示AlertDialog吗? - undefined
AlertDialog.Builder alert = new AlertDialog.Builder(this); - undefined
每次显示对话框时,你都重新创建它吗? - undefined
1
实际上,如果您提供一个完整的OnClick方法,在其中显示对话框,将非常有帮助。 - undefined
不,我把它添加到了OnCreate方法中。@Grimmy - undefined
我在onClick方法中添加了完整的代码 @Grimmy - undefined
3个回答

5
如果你想使用现有的视图,请使用这个。
alert.setOnDismissListener(new OnDismissListener(){
    ((ViewGroup)requestView.getParent()).removeView(requestView);
});

我手动将上述代码从 Kotlin 转换为 Java,请在使用前检查。


这应该是如何从AlertDialog Android中移除视图的正确答案。 - undefined

3
你的问题在这里:
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setView(requestView);

在这种情况下,alert不是对话框,而是一个构建器。所以每次当你试图显示它时,它都会重建这个对话框,并尝试添加相同的视图requestView,因为它在构建器中被缓存了。要解决这个问题,移动...
requestView = inflater.inflate(R.layout.send_request,null);
alert.setView(requestView);

将代码添加到您的OnClick方法中,以显示对话框。代码应该如下所示:

chatRequestbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              requestView = inflater.inflate(R.layout.send_request,null);
              alert.setView(requestView);

                alert.setPositiveButton("Send", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        request = requestMsg.getText().toString();

                        send();

                    }
                });
                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();

                    }
                });

                alert.show();

            }
        });

0

您想设置一个“dismiss”监听器。我做了类似的事情: 对话框应该设置一个“dismiss”监听器

alert.setOnDismissListener(new DialogInterface.OnDismissListener()  {
       @Override
       public void onDismiss(DialogInterface dialog) {
              ((ViewGroup)requestView.getParent()).removeView(requestView);
       }
 });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接