7

所以我有一个按钮,当它被点击时会显示一个警告对话框。我在活动的 onCreate 方法中为警报对话框创建视图。代码就在这里:

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

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

11-28 00:35:58.066:E/AndroidRuntime(30348):原因:java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。

我在按下按钮时显示 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();

任何帮助,将不胜感激!谢谢!

4

7 回答 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();
        }
}
于 2015-09-18T13:50:46.707 回答
1

我在警报对话框中遇到了类似的问题。第一次我夸大了一个视图,第二次我想显示一条消息。如果您显示一次警报对话框,那么您会膨胀视图并缓存该对话框。如果您第二次显示它,则会收到错误 IllegalStateException:"call removeView() on child's parent first"

我通过删除在第一次单击时膨胀并在第二次单击时显示消息的视图来解决此问题。- 每次在膨胀或创建消息之前删除视图或消息。

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(); }
于 2014-01-09T13:18:21.077 回答
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();
于 2013-07-30T11:50:54.077 回答
0

它表示您的“视图”已连接到父级。它发生在您调用 .setView(view) 时。如果我是对的 - alertDialog 类为您的视图提供父级。这是安卓的基础。ViewGroup 可能有很多子视图。我有类似的问题。所以,你可以试试这个 insinde onClick:

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

对我有帮助,希望对你有帮助!

于 2015-08-20T09:20:40.717 回答
-1

使用 alert.create(); 然后 alertd.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();
          }
        });
于 2012-11-28T08:45:23.020 回答
-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()
于 2012-11-28T08:50:17.407 回答
-2

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

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

在再次设置之前,它总是将视图设置为空。

于 2014-04-07T08:46:07.367 回答