android AlertDialog-指定的子项已具有父项

bvjveswy  于 2022-11-03  发布在  Android
关注(0)|答案(2)|浏览(146)

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

指定的子系已经有父系。您必须先在子系的父系上呼叫removeView()

我不知道为什么会发生这种情况。实际上,我读到了这个错误信息,可能给使用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);

即时检视

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(),那么它工作,但我需要它

jjhzyzn0

jjhzyzn01#

查看一些源代码,您似乎正在分配相同的视图示例(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();
});
vom3gejh

vom3gejh2#

查看您的代码,您调用show()AlertDialog.Builder示例。这就是您正确解决此问题的原因。
因此,您需要使用alertDialogBuilder.create()创建一个AlertDialog对象的示例。此create()方法返回AlertDialog对象,然后您可以调用show()。因此,让我们按照以下代码片段来更好地理解。首先,您需要创建一个名为createDailogObject的方法。

创建对话框对象()

public/private AlertDialog dialogName; //create global variable
...
createDialogObject();// this line create instance of AlertDialog
...
public void createDialogObject(){
       mLayout = (RelativeLayout) findViewById(R.id.relaLayout);
       EditText input = new EditText(MainActivity.this);
       AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
       LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
            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();
                }
            });

           // this following line will creates the AlertDialog instance
           dialogName = .create();
}
...

现在,您可以在任何地方调用show方法!!!。

iView1

iView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialogName.show();
        }
    });

也在...

iView 2界面

iView2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialogName.show();
        }
    });

我会百分百肯定的

相关问题