Android 按“菜单”按钮会导致活动中无操作栏的崩溃

Android 按“菜单”按钮会导致活动中无操作栏的崩溃,android,android-actionbar,android-optionsmenu,Android,Android Actionbar,Android Optionsmenu,我是Android的新手,正在开发我的第一个应用程序 我的主要活动中没有ActionBar。我不想在活动中显示任何菜单。一切正常,但当我按下设备本身的菜单按钮时,它会导致我的应用程序强制关闭,而不是忽略它 我正在为sdk>=8开发,所以我正在使用支持库。我曾尝试在代码中添加OnCreateOptionMenu(),但没有添加任何内容,但结果相同 我的应用程序名为GUI,包名为GUI。以下是日志: 10-09 19:52:32.920: E/AndroidRuntime(7440): FATAL

我是Android的新手,正在开发我的第一个应用程序

我的主要活动中没有
ActionBar
。我不想在
活动中显示任何菜单。一切正常,但当我按下设备本身的菜单按钮时,它会导致我的应用程序强制关闭,而不是忽略它

我正在为sdk>=8开发,所以我正在使用支持库。我曾尝试在代码中添加
OnCreateOptionMenu()
,但没有添加任何内容,但结果相同

我的应用程序名为GUI,包名为GUI。以下是日志:

10-09 19:52:32.920: E/AndroidRuntime(7440): FATAL EXCEPTION: main
10-09 19:52:32.920: E/AndroidRuntime(7440): java.lang.NullPointerException
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v7.app.ActionBarImplICS.getThemedContext(ActionBarImplICS.java:274)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v7.app.ActionBarActivityDelegate.getMenuInflater(ActionBarActivityDelegate.java:89)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v7.app.ActionBarActivity.getMenuInflater(ActionBarActivity.java:71)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.app.Activity.onCreatePanelMenu(Activity.java:2554)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:224)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v7.app.ActionBarActivityDelegateICS.onCreatePanelMenu(ActionBarActivityDelegateICS.java:141)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v7.app.ActionBarActivity.onCreatePanelMenu(ActionBarActivity.java:199)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onCreatePanelMenu(ActionBarActivityDelegateICS.java:280)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:453)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at com.android.internal.policy.impl.PhoneWindow.onKeyDownPanel(PhoneWindow.java:853)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at com.android.internal.policy.impl.PhoneWindow.onKeyDown(PhoneWindow.java:1535)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2052)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3924)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3872)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3007)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.os.Looper.loop(Looper.java:137)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at android.app.ActivityThread.main(ActivityThread.java:4921)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at java.lang.reflect.Method.invokeNative(Native Method)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at java.lang.reflect.Method.invoke(Method.java:511)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
10-09 19:52:32.920: E/AndroidRuntime(7440):     at dalvik.system.NativeStart.main(Native Method)

我想不出这个错误的原因是什么。请帮我找到它。如果需要任何其他信息,请告诉我。

我猜这是AppCompat库中的一个错误。如果查看ActionBarImplICS.getThemedContext()的代码,您会发现mActionBar为空:

我猜您使用的活动没有标题(因此也没有actionbar):

如果我删除它并启动带有标题/操作栏的活动,我就无法重现崩溃。现在,当你不想要或不需要标题栏时,使用标题栏运行应用程序不是一个很好的选择。我的建议是你覆盖菜单键。当我执行以下操作时,应用程序停止崩溃:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        // do nothing
        return true;
    }
    return super.onKeyDown(keyCode, event);
}   

看起来这将在下一个支持库版本中修复,该版本对我来说非常有效。是的,我为我的活动创建了一个没有标题栏的自定义主题。正如你正确指出的,错误的原因很可能是getThemedContext()函数。非常感谢你的帮助。我希望这对其他人来说也很方便。如果有人遇到同样的问题:我使用的是TabMenu,所以我必须在所有视图中添加此代码才能真正捕获事件。@britzl:我的疑问是,我还为其他活动实现了相同的actionbar。那为什么它不在那里崩溃呢?我是说没有actionbar。它在任何地方都能工作,除了一个特定的活动,在我修改为没有actionbar之前有actionbar。很抱歉,我没有正确检查它。它存在于所有其他活动中。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        // do nothing
        return true;
    }
    return super.onKeyDown(keyCode, event);
}