从服务类转换为活动时出现空指针异常

时间:2013-07-09 21:37:20

标签: android android-activity dialog nullpointerexception

我一直在尝试从PhoneListener服务类中弹出一个对话框。我附加了一个DialogBox活动类。我试图在呼叫状态改变时弹出对话框。我试过从静态铸造,显然我根本不懂静电。我似乎永远无法获得AlerDialg.Builder的活动或上下文。这是我在PHoneListener类中的调用:

    DialogBox.onCreateDialog2(1);

这里是DialogBox代码:

    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通过,但我得到一个null活动。 是的,我对开发代码并不熟悉,所以我确定我错过了一些明显的东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

活动初始化为null,永远不会赋值。这就是Nul​​lPointerException的来源。

答案 1 :(得分:1)

首先:声明为static的事物不包含有关对象的特定实例的任何信息。它不是一种物体,因此你不能“施放”它。如果需要在静态方法中访问活动实例中的某些内容,请将实例传递给该方法。

第二:您的静态接口定义未在此类中使用,可以删除。如果您希望此类实际实现该接口,则需要在类声明中指定(公共类DialogBox扩展Activity实现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
    }
}