2013-07-18 55 views
3

这里是我的问题:AlertDialog.show()让我的应用程序崩溃

我试图展示AlertDialog,但我似乎无法做到这一点。

这里是我的代码:

tv.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View arg0) 
     { 
      final EditText input = new EditText(c); 

      AlertDialog.Builder adb = new AlertDialog.Builder(c); 
      adb.setTitle(lb) 
      .setMessage("Test") 
      .setView(input) 
      .setPositiveButton("Ok", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) 
       { 
        //tv.setText(input.getEditableText().toString()); 
        Toast.makeText(c, input.getEditableText().toString(), Toast.LENGTH_LONG).show(); 
       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
      { 
        public void onClick(DialogInterface dialog, int whichButton) 
        { 
         dialog.cancel(); 
        } 
      }).show(); 
     } 
    }); 

我想将此AlertDialog当标签在用户点击后,再与编辑文本之一,当用户按OK键更改标签值。

但是,当谈到点击时显示对话框,它崩溃。

07-18 16:04:59.240: E/AndroidRuntime(10503): FATAL EXCEPTION: main 
07-18 16:04:59.240: E/AndroidRuntime(10503): android.view.WindowManager$BadTokenException: Unable to add window -- 
token null is not for an application 
07-18 16:04:59.240: E/AndroidRuntime(10503): at  android.view.ViewRootImpl.setView(ViewRootImpl.java:710) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:345) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.Dialog.show(Dialog.java:277) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.AlertDialog$Builder.show(AlertDialog.java:932) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.technicachat.webdatadomo.Consignes$2$1.run(Consignes.java:114) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.Activity.runOnUiThread(Activity.java:4784) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.technicachat.webdatadomo.Consignes$2.onClick(Consignes.java:90) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.View.performClick(View.java:4211) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.view.View$PerformClick.run(View.java:17267) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.os.Handler.handleCallback(Handler.java:615) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.os.Looper.loop(Looper.java:137) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at android.app.ActivityThread.main(ActivityThread.java:4898) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at java.lang.reflect.Method.invokeNative(Native Method) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at java.lang.reflect.Method.invoke(Method.java:511) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
07-18 16:04:59.240: E/AndroidRuntime(10503): at dalvik.system.NativeStart.main(Native Method) 

更少的行之前,我得到这个消息:

07-18 16:04:56.645: I/Choreographer(10503): Skipped 32 frames! The application may be doing too much work on its main thread. 

我知道这意味着什么,但我只是呈现出对话框,它不是这么多的工作!

我希望你们能帮助我!

再见

+0

什么是'c'变量? –

+0

@KenWolf一个上下文。 – Blackbelt

+0

哎呀抱歉,它只是上下文:c = getApplicationContext(); –

回答

22

你的变量c应该是YourActivity.this代替getApplicationContext()

+0

谢谢,它像一个魅力,BDW如何getApplicationContext()与YourActivity.this不同? –

0

试试这个烤面包。

Toast.makeText(getApplicationContext(), input.getEditableText().toString(), Toast.LENGTH_LONG).show(); 
0

您无法显示任何内容,无法创建AlertDialog类对象。

AlertDialog ad=adb.create(); 
ad.show(); 

现在它会工作检查一次。

2

我是从1,2天面对这一问题,但我解决了这个通过改变

最终对话框dialogView =新对话框(getApplicationContext());

最终对话框dialogView =新对话框(Leave_Notification_Activity.this);

您不应该使用getApplicationContext()而是传递YourActivity.this来解决此问题。

0

有几件事情需要考虑。

  1. 您正在自定义警报对话框,例如定位按钮和设置布局参数(如边距)。

    如果你这样做,使用V7支持的警报对话框将解决问题。确保您已在项目中导入了v7支持库。

    变化android.app.AlertDialog.Builderandroid.support.v7.app.AlertDialog.Builder

  2. 您在活动或子类的活动或内部片段 使用

    创建警报对话框总是传递活动场景和baseContextapplicationContext

    传递错误的上下文(例如applicationContext或baseContext)将导致WindowManager-BadToken异常

在活动...

AlertDialog.Builder dialog = new AlertDialog.Builder(this); 

在活动的子类...

AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); 

在片段...

AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()); // Activity inherits from Context and hence will work. 

我已经发现,对警报对话的大量定制对于v而言效果很好7支持AlertDialog类。

在我的情况下,如果有多个按钮,我必须将警报对话框的按钮居中并设置左右页边距。将导入更改为v7支持解决了该问题。

希望这会有所帮助。