Android fragments alertDialog java.lang.IllegalStateExceptio



我正在尝试使用ListView创建一个AlertDialog,但是如果我第二次选择AlertDialog,那么应用程序崩溃会给我这个错误

e/androidruntime:致命例外:主要 过程:wishautomatic.com.wishautomatic,pid:5342 java.lang.illegalstateException:指定的孩子已经有父母。您必须在孩子的父母上调用removeview(( 第一的。 at android.view.viewgroup.addviewinner(viewGroup.java:3880( at android.view.viewgroup.addview(viewgroup.java:3733( at android.view.viewgroup.addview(viewgroup.java:3709( 在com.android.internal.app.alertcontroller.setupview(alertcontroller.java:490( 在com.android.internal.app.alertcontroller.installcontent(AlertController.java:234( at android.app.alertdialog.oncreate(alertdialog.java:356( at android.app.dialog.dispatchonCreate(dialog.java:373( at android.app.dialog.show(dialog.java:274( 在wishautomatic.com.wishautomatic.createwishfragment $ getwishmessages.onpostexecute(createwishfragment.java:559( 在wishautomatic.com.wishautomatic.createwishfragment $ getwishmessages.onpostexecute(createwishfragment.java:461( 在android.os.asynctask.finish(asynctask.java:632( at android.os.asynctask.access $ 600(asynctask.java:177( at android.os.asynctask $ internalHandler.HandleMessage(asynctask.java:645( at android.os.handler.dispatchmessage(Handler.java:102( at android.os.looper.loop(looper.java:135( at android.app.activitythread.main(activityThread.java:5221( 在java.lang.reflect.method.invoke(本机方法(上 在java.lang.reflect.method.invoke(method.java:372( 在com.android.internal.os.os.zygoteinit $ methodandargscaller.run(zygoteinit.java:899( 在com.android.internal.os.os.zygoteinit.main(zygoteinit.java:694(

 @Override
    protected void onPostExecute(String result) {
        //Toast.makeText(getActivity(),result,Toast.LENGTH_LONG).show();
        msg=messagess.toArray(msg);
        dialog.dismiss();
           final  AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setView(listView);
                /**@Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //Toast.makeText(getActivity(),msg[i],Toast.LENGTH_LONG).show();
                    Toast.makeText(getActivity(), "Wish message selected", Toast.LENGTH_SHORT).show();
                    WishMessage.setText(msg[i]);
                }
            });**/
                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                ViewGroup vg =(ViewGroup)view;
                TextView txt=(TextView)vg.findViewById(R.id.textViewWishMessage);
                Toast.makeText(getActivity(),txt.getText().toString(),Toast.LENGTH_SHORT).show();
                WishMessage.setText(txt.getText().toString());
            }
        });
            builder.setNegativeButton("BACK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                }
            });
            AlertDialog alertDialog = builder.create();
            alertDialog.setTitle("Select a wish message");
            alertDialog.setCancelable(false);
            alertDialog.show();
    }
}

我将AlertDialog创建代码更改为这样的方法,

       public class CreateWishFragment extends Fragment {
    AlertDialog alertDialog;
     @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            alertDialog=builder.create();
            builder.setView(listView);
            alertDialog.setTitle("Select a wish message");
            alertDialog.setCancelable(true);
            if (savedInstanceState!=null){
                wishfor=savedInstanceState.getString("wishfor");
                WishFor.setText(wishfor);
            }
        }
  @Override
        protected void onPostExecute(String result) {
            //Toast.makeText(getActivity(),result,Toast.LENGTH_LONG).show();
            msg=messagess.toArray(msg);
            dialog.dismiss();
            //builder.setView(listView);
            alertDialog.show();
                    /**@Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        //Toast.makeText(getActivity(),msg[i],Toast.LENGTH_LONG).show();
                        Toast.makeText(getActivity(), "Wish message selected", Toast.LENGTH_SHORT).show();
                        WishMessage.setText(msg[i]);
                    }
                });**/
                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    ViewGroup vg =(ViewGroup)view;
                    TextView txt=(TextView)vg.findViewById(R.id.textViewWishMessage);
                    Toast.makeText(getActivity(),txt.getText().toString(),Toast.LENGTH_SHORT).show();
                    WishMessage.setText(txt.getText().toString());
                    if (alertDialog.isShowing()){
                        alertDialog.dismiss();
                    }
                }
            });
                builder.setNegativeButton("BACK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                });

        }

但是显示出这样的输出,警报对话框中没有什么它仅显示标题,而没有列表单击的图像

我想这是因为您再次重新创建相同的对话框(我相信onPostExecute被称为几次(。

在您的onCreate中构建一次,然后偶尔show

这也是一种更好的方法

如果您想以这种方式保留一切,我发现这可能会对您有所帮助!

相关内容

最新更新