我在我的应用程序中有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)
答案 0 :(得分:4)
不,不要这样做
JokeDetailsActivity jd = new JokeDetailsActivity();
您收到以下行中的错误,因为您没有正确的Context
。
AlertDialog.Builder dialog = new AlertDialog.Builder(JokeDetailsActivity.this);
您尝试在一个Activity
中调用它,但使用另一个Context
的{{1}}
您有几个选择
1只需在您的其他Activity
中重新创建此功能即可
使用正确的Activity
(Activity
)
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();
}