0

PhoneListener サービス クラスからダイアログをポップアップしようとしています。DialogBox アクティビティ クラスがアタッチされています。通話状態が変化したときにダイアログをポップしようとしています。static からのキャストを試みましたが、どうやら static をまったく理解していないようです。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;
    }       

}

((DialogBox)activity.getApplicationContext()).onCreateDialog(id); で NullPointerException が発生します。

ID は渡されますが、null アクティビティが発生します。はい、私は開発コードに精通していないので、明らかな何かが欠けていると確信しています。どんな助けでも大歓迎です。

4

2 に答える 2

1

まず、静的として宣言されたものには、オブジェクトの特定のインスタンスに関する情報が含まれていません。これはオブジェクトのタイプではないため、「キャスト」することはできません。静的メソッドのアクティビティ インスタンスから何かにアクセスする必要がある場合は、インスタンスをメソッドに渡します。

2 番目: 静的インターフェイス定義はこのクラスでは使用されないため、削除できます。このクラスで実際にそのインターフェイスを実装する場合は、クラス宣言でそれを指定する必要があります (パブリック クラス DialogBox extends Activity は DialogBoxPopUp を実装します)。

3 番目: クラス (DialogBox) は Activity オブジェクトを拡張するため、通常はここでコンテキストを取得します。

4 番目: このクラスは、abstract として宣言しないでください。

変数「アクティビティ」を削除します。変数を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
    }
}
于 2013-07-09T22:48:18.467 に答える
1

アクティビティは null として初期化され、値が割り当てられることはありません。それが NullPointerException の由来です。

于 2013-07-09T21:55:24.097 に答える