2017-01-26 53 views
1

我正在制作具有自定义EditText字段的ALert对话框。如何从AlertDialog中删除视图Android

我做了一个View变量,然后将其与我的自定义EditText字段关联。

requestView = inflater.inflate(R.layout.send_request,null); 

然后我补充说,以我的AlertDialog

alert.setView(requestView); 

此后,我加入的onClick方法要我的按钮进行警告对话框行动..

chatRequestbtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


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

         request = requestMsg.getText().toString(); 

         send(); 

        } 
       }); 
       alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 

        } 
       }); 

       alert.show(); 

      } 
     }); 

它的工作正确。但是当我再次按下按钮执行警报对话框选项时,在按下警报对话框上的取消选项后。

它崩溃,出现以下错误。

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
                      at android.view.ViewGroup.addViewInner(ViewGroup.java:4417) 
                      at android.view.ViewGroup.addView(ViewGroup.java:4258) 
                      at android.view.ViewGroup.addView(ViewGroup.java:4230) 
                      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:395) 
                      at android.app.Dialog.show(Dialog.java:294) 
                      at android.support.v7.app.AlertDialog$Builder.show(AlertDialog.java:955) 
                      at com.buckydroid.anonchat.User$3.onClick(User.java:86) 
                      at android.view.View.performClick(View.java:5637) 
                      at android.view.View$PerformClick.run(View.java:22433) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6126) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

我虽然使视图为空,并再次添加视图,同时单击按钮将解决问题。但同样的问题一次又一次..

+0

你能提供代码示例你如何创建和显示AlertDialog? – Grimmy

+0

AlertDialog.Builder alert = new AlertDialog.Builder(this); @Grimmy – Doge

+0

当你显示对话框时,你是否每次重新创建它? – Grimmy

回答

2

你的问题是在这里:

AlertDialog.Builder alert = new AlertDialog.Builder(this); 
alert.setView(requestView); 

在这种情况下alert不是对话,而是建设者。因此,每当您尝试显示它时,它都会重建此对话框并尝试为其添加相同的视图 - requestView。因为它被缓存在构建器中。修复它 - 移动

requestView = inflater.inflate(R.layout.send_request,null); 
alert.setView(requestView); 

您的OnClick方法显示对话框。所以它应该看起来像这样:

chatRequestbtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       requestView = inflater.inflate(R.layout.send_request,null); 
       alert.setView(requestView); 

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

         request = requestMsg.getText().toString(); 

         send(); 

        } 
       }); 
       alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 

        } 
       }); 

       alert.show(); 

      } 
     }); 
+0

非常感谢你:) – Doge

+1

@请不要客气;) – Grimmy