【问题标题】:Android - Context is null when using AlertDialogAndroid - 使用 AlertDialog 时上下文为空
【发布时间】:2012-12-02 16:16:14
【问题描述】:

编辑

不幸的是,所提供的答案都不起作用,但我确实找到了解决问题的方法。我没有使用 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 是否为空并且它返回为非空,但应用程序仍然崩溃。

【问题讨论】:

  • getContentView() 方法在哪里?

标签: android dialog alert fragment


【解决方案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;
}

【讨论】:

    【解决方案2】:

    你有没有尝试过改变

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

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

    看看这是否有效?除非您出于任何原因必须通过 mContext 。但据我所知,mContext 没有被设置并且保持为空。

    【讨论】:

      【解决方案3】:

      尝试删除空的构造函数:

      public SaveDialog() {
      }
      

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

      【讨论】:

      • 我认为他可能会创建一个对话框而不将上下文传递给其构造函数,然后将使用第一个构造函数并且在这种情况下上下文为空。但他说他正在传递上下文。我会删除这个答案
      【解决方案4】:

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

      你必须重写DialogFragment onCreate 函数来获得正确的Context,然后初始化你的mContext 变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        • 2020-09-16
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多