1

編集

残念ながら、提供された回答はどれも機能しませんでしたが、問題を解決する方法を見つけました。onCreateDialog メソッドを使用する代わりに、コンテキストをパラメーターとして取り、そこに alertDialog を作成する独自のメソッドを作成しました。これは最も理想的なソリューションではないかもしれませんが、必要なものには十分です。今後、さらに修正して変更していきます。これが私がしたことです。

ダイアログクラス:

public class SaveDialog extends FragmentActivity {


PasswordGen pG = new PasswordGen();


public Dialog createDialog(Context mContext) {

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

builder.setTitle("ok");
builder.setMessage("ok")
        .setCancelable(false)
        .setPositiveButton("ok", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        })
        .setNegativeButton("no", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        });

AlertDialog dialog = builder.create();
dialog.show();
return dialog;

MainActivity: ここで alertDialog を呼び出します。

    private void savePassword() {

    SaveDialog sD = new SaveDialog();


    sD.createDialog(mContext);


    }   

別のクラスに設定されている AlertDialog を設定しようとしています。ただし、メイン アクティビティから AlertDialog クラスにコンテキストを渡すと、NullPointerExceptionが発生します。

これは私の Alert Dialog クラスです

public class SaveDialog extends DialogFragment {

Context mContext;

public SaveDialog() {

}

public  SaveDialog(Context mContext) {

    this.mContext = mContext;
}

public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);



    builder.setTitle("Save Password");
    builder.setView(getContentView());
    Dialog dialog = builder.create();
//  dialog.show();
    return dialog;
}

これが onClick が起動される場所です。

private void savePassword() {

    mContext = PasswordGen.this;    

    SaveDialog savePasswordDialog = new SaveDialog(mContext);
    savePasswordDialog.show(savePasswordDialog.getFragmentManager(), "password");

    }

私は答えを切望しています。getApplicationContext() から getActivity() 、ActivityName.this まですべてを試しましたが、常に NullPointerException が発生します。mContext が null ではないかどうかを確認するメソッドをセットアップして、null ではないとして返されたにもかかわらず、アプリケーションは引き続きクラッシュします。

4

4 に答える 4

1

を作成しているのではなく、 を作成しAlertDialogていますDialogFragment。これのライフサイクルはかなり異なります。Android システムがフラグメントを作成するとき、SaveDialog(Context mContext)それはコンストラクターを経由せず、デフォルトのコンストラクターを経由するため、NullPointerException. そのコンストラクターを削除します。何もしません。

DialogFragment次のようなコンテキストを取得できます。

public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Save Password");
    builder.setView(getContentView());
    Dialog dialog = builder.create();
    return dialog;
}
于 2012-12-02T16:38:33.080 に答える
0

AlertDialog問題は、を使用してを作成するときに、nullに初期化された変数をBuilder使用していることだと思います。mContext

YoはDialogFragment onCreate関数をオーバーライドして正しく取得し、変数Contextを初期化する必要があります。mContext

于 2012-12-02T16:23:09.013 に答える
0

変えてみましたか

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

それが機能するかどうかを確認しますか?なんらかの理由で mContext を渡す必要がない限り。しかし、私が見ることができることから、mContext は設定されておらず、null のままです。

于 2012-12-02T16:25:10.840 に答える
0

空のコンストラクターを削除してみてください。

public SaveDialog() {
}

mContext を初期化するときに、2 番目のコンストラクターのみを保持します。

于 2012-12-02T16:33:41.170 に答える