0

我的应用程序中有 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)
4

5 回答 5

4

不,不要这样做

JokeDetailsActivity jd = new JokeDetailsActivity();

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

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

您正在尝试调用它,Activity但使用Context另一个Activity

你有几个选择

1 只需在您的其他函数中重新创建此函数,然后使用正确的( )Activity调用它 ActivityContextActivityName.this

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

3 将此方法放入 aBaseActivityActivities扩展此BaseActivity方法并将方法放在那里。

我记得#4

您还可以创建一个单独的Activity,例如AboutActivity,来处理/显示您想要的任何内容,并Dialog Theme通过将以下行添加到<activity您的标签中来给它一个manifest

android:theme="@android:style/Theme.Dialog"

然后你就Activity从你需要的任何地方开始。

于 2013-09-12T20:34:36.893 回答
2

这是什么

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

如果你想启动 Activity,你应该使用 Intent

你不应该实例化活动

创建一个单独的类传递上下文并在那里创建你的 aboutMe() 方法,然后重用它

或者

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

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());
于 2013-09-12T20:33:06.267 回答
0

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

于 2013-09-12T20:32:35.433 回答
0

是的,就是这样,您开始了一个活动,例如:

    Intent intent = new Intent(this, YourActivity.class);
    startActivity(intent);
于 2013-09-12T20:37:16.797 回答
0

你不能像这样实例化一个 Activity 类并使用它。Activity 的创建由 Android 系统处理,它需要获取 Context 和其他东西(这是你没有的东西,当你实例化 AltertDialog 构建器时确实会用到,因此会出现空指针异常) . 我建议您将该方法 aboutMe 设为静态方法,并将 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();              
}
于 2013-09-12T20:37:51.820 回答