Android对话框错误:“指定的子项已经有父级。您必须先在子项的父级上调用removeView()”。

5

我正在尝试向我的listView提供数据,当点击FAB时,它会显示一个带有一个editText和两个按钮的对话框。第一次允许我向ListView提供数据。但是当我尝试第二次时,它会显示以下错误:

FATAL EXCEPTION: main
Process: com.example.app.wounderlist.wounderlist, PID: 3790
java.lang.IllegalStateException: 指定的子项已经有了父级。您必须首先在子项的父级上调用 removeView()。 at android.view.ViewGroup.addViewInner(ViewGroup.java:3562) at android.view.ViewGroup.addView(ViewGroup.java:3415) at android.view.ViewGroup.addView(ViewGroup.java:3391) 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:361) at android.app.Dialog.show(Dialog.java:262) at com.example.app.wounderlist.wounderlist.HomeFragment$1.onClick(HomeFragment.java:79) at android.view.View.performClick(View.java:4444) at android.view.View$PerformClick.run(View.java:18457) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5113) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) at dalvik.system.NativeStart.main(Native Method)

这是我的代码:

//create a dialog box with a editText and a Add button when pressing the #FAB
        final EditText taskEditText = new EditText(getActivity());
        mFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog dialog = new AlertDialog.Builder(getActivity())
                        .setTitle("Add a new task")
                        .setMessage("What do you want to do next?")
                        .setView(taskEditText)
                        .setPositiveButton("Add", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                //for getting text from the editText
                                String itemText = taskEditText.getText().toString();
                                mItemsAdapter.add(itemText);


                            }
                        })
                        .setNegativeButton("Cancel", null)
                        .create();
                dialog.show();
            }
        });

你在其他地方使用了 taskEditText 吗? - Orest Savchak
我只是在 setView(taskEditText) 中使用它,在 String itemText = taskEditText.getText().toString() 处使用。 - user7294802
你需要将EditText放置在一个布局中,例如相对布局、线性布局或帧布局,然后将其添加到AlertDialog中。 - Mean Coder
2个回答

8

您正在每次按钮单击时创建一个新的AlertDialog实例。请在OnClickListener内部类之外创建一个final AlertDialog

尝试这样做:

 final EditText taskEditText = new EditText(getActivity());
AlertDialog.Builder builder1 = new AlertDialog.Builder(getActivity());
builder1.setMessage("What do you want to do next?");
builder1.setCancelable(true);

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

                                //for getting text from the editText
                                String itemText = taskEditText.getText().toString();
                                mItemsAdapter.add(itemText);

                            }
                        });

builder1.setNegativeButton(
   "Cancel", null);

AlertDialog alert11 = builder1.create();

 mFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               alert11.show();
            }
        });

0
final EditText taskEditText = new EditText(getActivity());
        AlertDialog.Builder builder1 = new AlertDialog.Builder(getActivity());
        builder1.setMessage("What do you want to do next?");

        //I add this extra code to get the EditText
        builder1.setView(taskEditText);
        builder1.setCancelable(true);

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

                //for getting text from the editText
                String itemText = taskEditText.getText().toString();
                mItemsAdapter.add(itemText);

                //And I also add this code to clear the editText
                taskEditText.setText("");

            }
        });

        builder1.setNegativeButton(
                "Cancel", null);

        final AlertDialog alert11 = builder1.create();

        mFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                alert11.show();
            }
        });

终于我得到了答案

感谢所有人,特别是 @rafsanahmad007

愉快编程!


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