2013-07-09 26 views
0

我一直在嘗試從PhoneListener服務類中彈出一個對話框。我有一個DialogBox活動類附加。我試圖在通話狀態改變時彈出對話框。我已經嘗試從靜態鑄造,顯然我不明白靜態。我永遠無法得到AlerDialg.Builder的活動或上下文。下面是我在PHoneListener級呼叫:從服務類別轉換爲活動時出現空指針異常

DialogBox.onCreateDialog2(1); 

這裏的對話框代碼:

public abstract class DialogBox extends Activity { 

static abstract interface DialogBoxPopUp { 
    void onCreateDialog(int id); 

    void onCreateDialog2(int id); 
} 

    Dialog dialog = null; 
    int DIALOG_X = 1; 
    int DIALOG_Y = 2; 
    int DIALOG_Z = 3; 

    private static Activity activity = null; 
    private static final String LOGTAG = "DialogBoxPopUp"; 

    AlertDialog alertDialog;   

    public Dialog onCreateDialog(int id) { 

     switch(id) { 
     case 1: 
      // do the work to define the X Dialog 

      AlertDialog.Builder builder=new AlertDialog.Builder(activity.getParent()); 
      PMLog.d(LOGTAG, "Got to PopUp, have an activity?"); 

       builder 
        .setTitle("Privus Mobile") 
        .setMessage("Lookup this number?") 
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() 
        { 
         public void onClick(DialogInterface dialog, int which) 
         { 
          onYes(); 
         } 
        }) 
        .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() 
        { 
         public void onClick(DialogInterface dialog, int which) 
         { 
          onNo(); 
         } 
        }) 
        .setOnCancelListener(new DialogInterface.OnCancelListener() 
        { 
         public void onCancel(DialogInterface dialog) 
         { 
          onNo(); 
         } 
        }) 

        .show(); 
       PMLog.d(LOGTAG, "Got to show");   

      break; 

     default: 
      dialog = null; 
     } 
     return dialog; 
    } 


    public static void onYes() { 

     PrivusPhoneStateListener.lookupCallerId(); 
    } 

    public static void onNo() { 

     return; 
    } 


    public static Dialog onCreateDialog2(int id) { 

      ((DialogBox) activity.getApplicationContext()).onCreateDialog(id); 

     return null; 
    }  

}

我得到一個NullPointerException ((對話框)activity.getApplicationContext()) .onCreateDialog(ID);

該ID通過,但我得到一個空活動。 是的,我不太熟悉開發代碼,所以我肯定我錯過了一些明顯的東西。任何幫助將不勝感激。

回答

1

第一:聲明爲靜態的東西不包含關於對象的特定實例的任何信息。它不是一種對象,因此你不能「施放」它。如果您需要從靜態方法的活動實例中訪問某些內容,請將該實例傳遞給該方法。

其次:您的靜態接口定義不在此類中使用,並且可以刪除。如果你想讓這個類實際實現這個接口,你需要指定在類聲明中(public class DialogBox extends Activity implements DialogBoxPopUp)。

第三:由於您的類(DialogBox)會擴展Activity對象,因此您通常會在此處獲取上下文。

第四:這個類不應該被聲明爲抽象的。

刪除變量「activity」 - 你正在初始化它爲null而不是其他任何東西,所以它永遠不會有上下文。

但是,這是我認爲你想要的:一個幫助你建立對話框的類。如果是這樣的話,可以使方法靜態的,但你將需要通過有效的情況下,以靜態方法(我沒有跑或編譯的這一點,所以把它當作僞代碼):

public class MyDialogBox{ 
    private MyDialogBox(){} //private constructor so this class can't be instantiated 
    public static void ShowDialog(Context c, OnClickListener onYesClick, 
            OnClickListener onNoClick, OnCancelListener onCancel){ 
     AlertDialog.Builder builder=new AlertDialog.Builder(c); 
     builder 
      .setTitle("Privus Mobile") 
      .setMessage("Lookup this number?") 
      .setPositiveButton(R.string.yes, onYesClick) 
      .setNegativeButton(R.string.no, onNoClick) 
      .setOnCancelListener(onCancel) 
      .show(); 
    } 
} 

然後,在調用上述方法的活動中:

public class MyActivity extends Activity { 

    //normal implementation code 

    public void SomethingHappenedShowMyDialog(){ 
     MyDialogBox.ShowDialog(
      this, //"this" refers to this activity, and activity extends a context 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        MyActivity.this.onYes(); //call the defined method 
       } 
      }, 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        //or just define it here 
        Toast.makeText(MyActivity.this, "No Clicked", Toast.LENGTH_SHORT).show(); 
       } 
      }, 
      new DialogInterface.OnCancelListener(){ 
       public void onCancel(DialogInterface dialog){ 
        //do something 
       } 
      }); 
    } 

    public void onYes(){ 
     //do something 
    } 
} 
1

該活動被初始化爲空,並且永遠不會分配一個值。這是NullPointerException來自的地方。