2013-07-18 86 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支持解決了該問題。

希望這會有所幫助。