2012-11-16 38 views
0

我的應用程序從主視圖中打開一個新的視圖以:AlertDialog.Builder秀(),暴​​跌單擊處理

Intent ElementsIntent = new Intent(this, ElementList.class); 
startActivityForResult(ElementsIntent, 0); 

這表明元素的列表,並推動這些元素的1時,視圖打開與以前一樣使用新的活動。在這個視圖中,我想在按鈕點擊處理程序中顯示一個AlertDialog,但是當我調用show()時,應用程序崩潰。

我很確定它與上下文不正確根據我試圖打開對話框,但我已經嘗試從主視圖做一個靜態上下文,我嘗試過與element.this ,這是連接到活動的類,並且我嘗試了getApplicationContext,並且所有這些都導致應用程序崩潰。

我希望有人能解釋我做錯了什麼。

謝謝。

這裏是AlertDialog代碼崩潰:

public void GoBackClickHandler(View v) 
{ 
    AlertDialog.Builder builder = new AlertDialog.Builder(ElementItem.this); 
    builder.setMessage("Skal ændringer i besvarelse gemmes?") 
      .setCancelable(false) 
      .setPositiveButton("Ja", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       if(inputIsValue()) 
       { 
        UpdateELement task = new UpdateELement(); 
        task.applicationContext = ElementItem.this; 
        task.execute(1); 
       } 
       } 
      }) 
      .setNegativeButton("Nej", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
        finish(); 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show();  
} 

如果我這個代碼移到OnCreate中,則警報顯示就好了,沒有應用程序崩潰。只有當我將它放在ClickHandler中時,它纔會崩潰。

+1

請發佈logcat消息。 – kosa

+2

我們將需要啓動AlertDialog的代碼來幫助您。 –

+0

如果你在一個匿名類,Activity.this通常是一個簡單的方法來獲取上下文 – Luke

回答

1

我終於找到了解決這個問題的辦法。

我不得不將Activity的上下文保存在onCreate方法的變量中,然後在ClickHandler AlertDialog調用中使用它,然後一切正常。

希望這將有助於其他人這個惱人的問題。

1
public class SplashActivity extends AppCompatActivity implements DialogInterface.OnClickListener { 

    //Object to hold the listener instance 
    DialogInterface.OnClickListener listener; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     //Assign this to listener. 
     listener = this; 

     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 

       AlertDialog.Builder builder = new AlertDialog.Builder(SplashActivity.this); 
       builder.setTitle("Alert"); 
       builder.setMessage("Alert Message...!"); 

       //Here pass the listener object. 
       builder.setPositiveButton("OK", SplashActivity.this.listener); 
       builder.show(); 

      } 

     }); 

    } 

    @Override 
     public void onClick(DialogInterface dialog, int which) { 

      SplashActivity.this.finish(); 
     } 

}