【问题标题】:Pressing menu button causes crash in Activity with no ActionBar按下菜单按钮会导致没有 ActionBar 的 Activity 崩溃
【发布时间】:2013-10-17 00:19:48
【问题描述】:

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

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

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

我的应用程序的名称是 GUI,包是 gui。这是Logcat:

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)

我无法弄清楚这个错误的原因是什么。请帮我找到它。如果需要任何其他信息,请告诉我。

【问题讨论】:

    标签: android android-actionbar android-optionsmenu


    【解决方案1】:

    看起来这将在下一个支持库版本http://code.google.com/p/android/issues/detail?id=61394中修复

    【讨论】:

      【解决方案2】:

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

      http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/support/v7/app/ActionBarImplICS.java#ActionBarImplICS.getThemedContext%28%29

      我的猜测是您正在使用没有标题的活动(因此也没有操作栏):

      requestWindowFeature(Window.FEATURE_NO_TITLE);
      

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

      @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:我的疑问是,我也为其他活动实现了相同的操作栏。那为什么它不在那里崩溃呢?
      • 我的意思是没有操作栏。它在任何地方都可以工作,除了一个特定的活动,在我修改为没有操作栏之前有操作栏。
      • 对不起,我没有正确检查。它存在于所有其他活动中。
      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 2011-07-03
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多