AlertDialog-The 指定 child 已经有一个 parent

AlertDialog-The specified child already has a parent

当我尝试在 ImageViews(iViewiView2) 中添加 alertDialog.show() 时,我的代码崩溃并给出

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

我不知道为什么会这样。其实我读到了这个错误信息,可能给了使用 2 次 alertDialog.show() 有什么建议吗?

mLayout = (RelativeLayout) findViewById(R.id.relaLayout);
final EditText input = new EditText(MainActivity.this);
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT
            ,LinearLayout.LayoutParams.MATCH_PARENT);

iView

input.setLayoutParams(lp);
    iView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            select = 0;

            alertDialog.setView(input);
            alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    m_Text = input.getText().toString();
                    mLayout.addView(cth[0].setCardView(select, m_Text));
                    iView.setClickable(false);
                }
            });
            alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            alertDialog.show();
        }
    });

iView2

iView2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            select = 1;
            //input.setLayoutParams(lp);
            alertDialog.setView(input);
            alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    m_Text = input.getText().toString();
                    mLayout.addView(cth[0].setCardView(select, m_Text));
                    iView2.setClickable(false);
                }
            });
            alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            alertDialog.show();
        }
    });

如果我评论 alertDialog.show() 那么它可以工作,但我需要它

查看一些源代码,您似乎正在将相同的视图实例(EditText "input")分配给警报对话框。每次调用 show() 方法时,都会通过 create() 创建对话框。然后将提供给 setView() 的视图添加到生成的对话框布局中。由于该视图已添加到布局中,因此它现在具有父级(对话框布局)。在再次显示对话框之前,您必须从父视图 (AlertDialog) 中删除视图,或者实例化一个新视图。

只需移动将 EditText 实例化到侦听器内部的行(并删除 final 修饰符,在此范围内不需要它)即可解决我的问题。 (我能够重现)

iView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View v) {
        // Create the edit text view.
        EditText input = new EditText(MainActivity.this);

        // Set it.
        alertDialog.setView(input);

        // Set it.
        alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                m_Text = input.getText().toString();
                mLayout.addView(cth[0].setCardView(select, m_Text));
                v.setClickable(false);
            }
        });

        // Set it.
        alertDialog.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });

        // Show it.
        alertDialog.show();
});