如何在Android中移除子视图的父视图?

7

我有一个按钮,当点击它时会显示警示对话框。我在我的活动的onCreate方法中创建了这个对话框的视图。代码如下:

    LayoutInflater factory = LayoutInflater.from(this);
    view = factory.inflate(R.layout.grade_result, null);

当我第一次按下按钮时,对话框会以我想要的方式显示出来,但是当我第二次按下按钮时,就会抛出这个异常。

11-28 00:35:58.066: E/AndroidRuntime(30348): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

我的代码用于在按下按钮时显示AlertDialog窗口,代码如下:

public void details(View v){
    final AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setView(view);
    alert.setMessage("Details About Your Grades")
    .setCancelable(false)
    .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id){
            dialog.cancel();

        }
    });
    alert.show();

非常感谢您的帮助!

谢谢!

7个回答

5

对我来说,在AlertDialog的Builder中设置应该设置的视图可行:

Button mButton = (Button) findViewById(R.id.my_button);
mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // inflating view out of the onClick() method does not work
            LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final ViewGroup viewGroup= (ViewGroup) mInflater.inflate(R.layout.my_view, null);

            Dialog alertDialog = new AlertDialog.Builder(getActivity())
                    .setTitle(R.string.my_title)
                    .setView(viewGroup)
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    }).create();
            alertDialog.show();
        }
}

1
我曾遇到警告对话框的类似问题。第一次我填充了一个视图,第二次我想显示一条消息。 如果您只显示一次警告对话框,那么您就会填充视图并缓存对话框。 如果您第二次显示它,则会出现错误 IllegalStateException:“在子项的父项上首先调用removeView()”
我通过在第一次单击时删除我填充的视图并在第二次单击时显示消息来解决此问题。 -每次在填充或创建消息之前都要删除视图或消息。
alertDialogBuilder.setView(null).setMessage(null);
alertDialogBuilder.setView(yourView).setMessage(yourMessage);

我修改了你的代码,现在它可以很好地运行。

LayoutInflater factory = LayoutInflater.from(this);
mView = factory.inflate(R.layout.grade_result, null);

public void details(View v){
    final AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setView(null).setMessage(null);
    alert.setView(mView);
    alert.setMessage("Details About Your Grades")
    .setCancelable(false)
    .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id){
            dialog.cancel();

        }
    });
    alert.show(); }

1

它说你的“视图”与父级相连。当你调用.setView(view)时发生这种情况。如果我没错的话,alertDialog类为你的视图提供了父级。这是Android的基础知识。ViewGroup可以有很多子View。我曾经遇到过类似的问题。 因此,在onClick中尝试使用以下代码:

ViewGroup vGroup = view.getParent();
vGroup.removeView(view);
// And right after that - close dialog
dialog.dismiss();

它帮助了我,希望它也能帮助你!


0
使用这个:

final AlertDialog.Builder alert = new AlertDialog.Builder(ProductsListAfterFilter.this);
alert.setTitle("Добавить продукт в корзину?");
alert.setMessage("Введите количество: ");

// Set an EditText view to get user input
final EditText input = new EditText(ProductsListAfterFilter.this);
alert.setView(input);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
        int value = 0 ;
    try {
            value = Integer.valueOf(input.getText().toString());
    }
    catch (Exception err){
            Toast.makeText(getApplicationContext(), "Введите число", 100).show();
    }
    //insertValue(value,st1,st2,st3,st4);
    Toast.makeText(getApplicationContext(), "value = "+value, 100).show();
    dialog.dismiss();
    dialog.cancel();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    // Canceled.
        dialog.cancel();
        dialog.dismiss();

    }
});


final AlertDialog alertd = alert.create();
alertd.show();

-1
使用 alert.create(),然后使用 alert.dismiss() 销毁对话框。
 final AlertDialog.Builder alert = new AlertDialog.Builder(this);
        final AlertDialog alertd = alert.create();

        alert.setTitle("Title");
        alert.setMessage("Messaage");

        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int whichButton) {
            // Canceled.
              dialog.cancel();
              alertd.dismiss();
          }
        });

它没有起作用,我仍然遇到同样的问题,有时对话框甚至不会出现。 - vinee109
它没有显示,仅仅是因为他没有在警告对话框上调用show()方法。但是你的问题更加复杂,如果你可以调用dismiss()方法,那么问题就很简单了。问题在于,对话框也可以通过触摸屏幕的其他部分来隐藏,在这种情况下,您不会点击任何按钮,因此无法调用dismiss()方法。我认为你应该使用一个监听器来捕获对话框的隐藏并调用dismiss()方法,或者类似的解决方案。 - Lorenzo Barbagli

-1
请使用这段代码。
final AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setView(view);
alert.setMessage("Details About Your Grades")
.setCancelable(false)
.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int id) 
    {
        dialog.dismiss();
    }
});
AlertDialog alertdialog = alert.create();
alertdialog .show()

-2

在设置对话框视图之前,您可以将视图设置为 null。
就像这样:

alert.setView(null);
alert.setView(view);

在重新设置视图之前,它将始终将视图设置为 null。


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