2013-08-23 84 views
0

我想知道我的代碼出了什麼問題,或者我的代碼中缺少什麼。這是我的場景:爲什麼這個alertView不會生成並導致應用程序崩潰?

我有一個ListView和一個CustomAdapter從其BaseAdapter派生的數據。

我已經爲每個項目定製了一個視圖。

在這個自定義視圖(又名單元格)中,我已經應用了longClickListener。長時間按下單元格後,長按方法被成功調用。到這裏沒問題。

但是現在我添加了用於在此方法中生成AlertDialog的代碼,AlterDialog將永遠不會生成並崩潰整個應用程序。

我試圖在現在保存alertDialog生成的類的外部創建另一個方法。然後我從longClickListener的接口方法調用這個外部方法。但仍然是同樣的崩潰。

然後我嘗試通過Runnable創建整個alertDialog,並在1秒後通過處理程序啓動Runnable,但alertDialog永遠不會生成並導致應用程序崩潰。

以下是代碼至今:

void called() 
    { 
     Handler h = new Handler(); 
     Runnable r = new Runnable(){ 
      @Override 
      public void run() 
      { 
       Log.d("mx", "about to run!"); 
       AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(FolderCell.this.getContext()); 
       alertDialogBuilder 
        .setTitle("title") 
        .setMessage("message") 
        .setCancelable(false) 
        .setNegativeButton("OK",new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog,int id) { 
          dialog.cancel(); 
         } 
        }); 

        AlertDialog alertDialog = alertDialogBuilder.create(); 
        alertDialog.show(); 
      } 
     }; 

     h.postDelayed(r, 1000); 
    } 

    @Override 
    public boolean onLongClick(View arg0) { 
     // TODO Auto-generated method stub 
     Log.d("mx", "Long clicked!"); 

     this.called(); 

     return true; 
    } 

崩潰日誌:

08-23 23:40:39.734: E/AndroidRuntime(32390): FATAL EXCEPTION: main 
08-23 23:40:39.734: E/AndroidRuntime(32390): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.ViewRootImpl.setView(ViewRootImpl.java:589) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.app.Dialog.show(Dialog.java:277) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at com.rdmteq.pic_measure.FolderCell$2.run(FolderCell.java:216) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.os.Handler.handleCallback(Handler.java:615) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.os.Looper.loop(Looper.java:137) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at android.app.ActivityThread.main(ActivityThread.java:4794) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at java.lang.reflect.Method.invoke(Method.java:511) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
08-23 23:40:39.734: E/AndroidRuntime(32390): at dalvik.system.NativeStart.main(Native Method) 

附加信息上,其中FolderCell是在層次結構

MainActivity (Activity Class) 
    | 
    contains--> ListView (ListView Class) 
      | 
      --> CustomAdapter (BaseAdapter Class) and set to ListView 
        |      
        contains-> FolderCell (RelativeLayout Class) generated in getView(..) 

誰能幫我這個 ?

+0

確保你逝去的當前運行的活動上下文AlertDialog.Builder'構造函數 –

+0

我試着通過傳遞一個引用直到單元格傳遞上下文,並且我也嘗試傳遞單元格的上下文,但是仍然崩潰... – CodenameLambda1

回答

0

你可以嘗試使用FolderCell.this而不是FolderCell.this.getContext() 並檢查這是否會在主線程中工作。

+0

FolderCell.this使它成爲一個錯誤。該程序不編譯 – CodenameLambda1

+0

'FolderCell.this' - 是一個主類嗎?你能給所有的類代碼嗎? –

+0

我已經編輯我的問題furthe r顯示包含FolderCell的詳細信息。 – CodenameLambda1

0

您正試圖從不是UI線程的線程顯示AlertDialog

做你想做什麼,你必須使用一個HandlerAsyncTask(顯示AlertDialogonPostExecute()方法。在我看來,該AsyncTask方式更容易。

相關問題