调用方法的空指针异常

时间:2013-09-12 20:27:22

标签: android android-activity nullpointerexception menuitem

我在我的应用程序中有2个活动,在第二个活动中我点击了“关于”android动作栏图标时运行的代码。在第一个活动中,我有相同的操作栏菜单项,我想再次调用这个“约”方法,但是当我点击它时,我有空指针异常。有人帮忙吗?

这是第二个活动中定义的方法--JokeDetailsActivity

public void aboutMe(){
    AlertDialog.Builder dialog = new AlertDialog.Builder(JokeDetailsActivity.this);
    dialog.setTitle("About");
    dialog.setMessage("Hello! I'm ..., the creator of this application."
               +"If there is any bug found please freely e-mail me. "+
                "\n ...."
               );
    dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

           @Override
           public void onClick(DialogInterface dialog, int which) {
               dialog.cancel();

           }
       });
       dialog.show();              
}

当我在第一个活动中调用它时

case R.id.action_about:

        JokeDetailsActivity jd = new JokeDetailsActivity();
        jd.aboutMe();
        return true;
    }

这就是我得到的错误

09-12 20:11:42.748: E/AndroidRuntime(1032): FATAL EXCEPTION: main
09-12 20:11:42.748: E/AndroidRuntime(1032): java.lang.NullPointerException
09-12 20:11:42.748: E/AndroidRuntime(1032):     at            android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:140)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at           android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:103)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:143)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at android.app.AlertDialog$Builder.<init>(AlertDialog.java:360)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at ie.myjokes.JokeDetailsActivity.aboutMe(JokeDetailsActivity.java:293)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at ie.myjokes.CategoryActivity.onOptionsItemSelected(CategoryActivity.java:140)
09-12 20:11:42.748: E/AndroidRuntime(1032):     at android.app.Activity.onMenuItemSelected(Activity.java:2548)

5 个答案:

答案 0 :(得分:4)

不,不要这样做

JokeDetailsActivity jd = new JokeDetailsActivity();

您收到以下行中的错误,因为您没有正确的Context

AlertDialog.Builder dialog = new AlertDialog.Builder(JokeDetailsActivity.this);

您尝试在一个Activity中调用它,但使用另一个Context的{​​{1}}

您有几个选择

1只需在您的其他Activity中重新创建此功能即可     使用正确的ActivityActivity

Context中调用它

2创建一个单独的类,所有这些ActivityName.this都可以调用它来使用此函数并将正确的Activities传递给该类。

3将此方法放在Context中,让BaseActivity扩展此Activities并将方法放在那里。

我记得#4

您还可以创建一个单独的BaseActivity,例如Activity来处理/显示您想要的任何内容,并通过将以下行添加到AboutActivity来为其提供Dialog Theme<activity

中的代码
manifest

然后你就可以从你需要的任何地方开始android:theme="@android:style/Theme.Dialog"

答案 1 :(得分:2)

这是什么

 JokeDetailsActivity jd = new JokeDetailsActivity();
 jd.aboutMe();

如果要启动Activity,则应使用intent

执行此操作

您永远不应该实例化活动

创建一个单独的Class pass Context并在那里创建aboutMe()方法,然后重用它

OR

或者您可以在其中创建静态方法

public static void aboutMe(Context mContext){
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
    dialog.setTitle("About");
    dialog.setMessage("Hello! I'm ..., the creator of this application."
               +"If there is any bug found please freely e-mail me. "+
                "\n ...."
               );
    dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

           @Override
           public void onClick(DialogInterface dialog, int which) {
               dialog.cancel();

           }
       });
       dialog.show();              
}

然后像

一样使用它
JokeDetailsActivity.aboutMe(getApplicationContext());

答案 2 :(得分:0)

将该方法声明为static并将其称为JokeDetailsActivity.aboutMe(yourActivityContext)。不要创建活动对象并记住传递context,然后可以使用它来创建对话框。 @ Hi-Tech KitKat Android有更详细的答案。

答案 3 :(得分:0)

是的,你就是这样开始一个活动:

    Intent intent = new Intent(this, YourActivity.class);
    startActivity(intent);

答案 4 :(得分:0)

您无法像这样实例化Activity类并使用它。 Activity创建由Android系统处理,它需要获取Context和stuff之类的东西(这是你没有的东西,你可以使用,例如,实例化AltertDialog构建器,因此空指针异常) 。我建议您将关于Me的方法设为静态方法,并将Context对象传递给它:

public static void aboutMe(Context context){
    AlertDialog.Builder dialog = new AlertDialog.Builder(context);
    dialog.setTitle("About");
    dialog.setMessage("Hello! I'm ..., the creator of this application."
               +"If there is any bug found please freely e-mail me. "+
                "\n ...."
               );
    dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

           @Override
           public void onClick(DialogInterface dialog, int which) {
               dialog.cancel();

           }
       });
       dialog.show();              
}