Android - 使用AlertDialog时Context为null

时间:2012-12-02 16:16:15

标签: android dialog alert fragment

修改

不幸的是,提供的答案都没有用,但我确实找到了解决问题的方法。我没有使用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

这是我的警报对话类

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我认为问题在于,当您使用AlertDialog创建Builder时,您正在使用初始化为null的mContext变量。

Yo必须覆盖DialogFragment onCreate函数才能获得正确的Context,然后初始化您的mContext变量。

答案 2 :(得分:0)

您是否尝试过更改

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

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

看看是否有效?除非你因任何原因必须传递mContext。但是从我可以看到mContext没有设置并保持为null。

答案 3 :(得分:0)

尝试删除空构造函数:

public SaveDialog() {
}

并在初始化mContext时仅保留第二个构造函数。