【问题标题】:Getting crash on menu key on Samsung devices三星设备上的菜单键崩溃
【发布时间】:2016-03-01 10:48:20
【问题描述】:

我收到来自三星设备(Galaxy Note 10.1 2014 Edition (lt03wifi)、Galaxy Note 10.1 2014 Edition (lt03lte)、Galaxy Note3 (hlte)、Galaxy Note3 Neo (hl3g) 等)用户的崩溃报告,所有运行安卓 5.1。 当用户在我的应用程序中按下物理菜单键时,会引发以下异常。其他设备可以正常打开菜单并正确显示。

android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:2452)
at android.content.res.Resources.getDrawable(Resources.java:1947)
at android.content.Context.getDrawable(Context.java:409)
at com.android.internal.policy.impl.PhoneWindow.openPanel(PhoneWindow.java:810)
at com.android.internal.policy.impl.PhoneWindow.onKeyUpPanel(PhoneWindow.java:1092)
at com.android.internal.policy.impl.PhoneWindow.onKeyUp(PhoneWindow.java:2179)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2625)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4881)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4836)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4300)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4353)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4319)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4327)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4502)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4300)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4353)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4319)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4327)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4300)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4353)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4319)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4478)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4720)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2811)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2403)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2394)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2788)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:143)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:6873)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

如何解决此问题?

我的活动 onCreateOptionsMenu:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_develop, menu);
    StyleApp.styleMenu(menu,this);
    return true;
}

styleMenu 函数:

public static void styleMenu(Menu menu,Context c) {
    ColorFilter colorFilter = getColorFilter(c);

    for(int i=0;i<menu.size();i++){
        MenuItem item=menu.getItem(i);
        Drawable icon=item.getIcon();
        icon.setColorFilter(colorFilter);
    }
}

【问题讨论】:

  • 我在 LG 设备上遇到了类似的问题。你能在 GitHub 上查看这个问题吗? github.com/midhunhk/message-counter/issues/6。该解决方案基于此答案stackoverflow.com/a/27024610/592025
  • 感谢您的提示 midhunhk!但 LG 错误似乎不同,因为它抛出 NullPointerException 而这个是 Resources$NotFoundException。
  • 资源 ID #0x0 看起来很有趣。你能检查你的 R.java 看看它是否存在吗?是否有可能在不同的变体资源文件中缺少资源,例如 api 或屏幕宽度等。
  • 希望你没有像stackoverflow.com/a/20177019/592025这样的情况。
  • 0x0 表示指向资源的指针可能无效,应该没有 id 为零的资源。我只是用 Android(Menu xml 和 menu inflater)给菜单充气,如上所述,所有其他设备都可以很好地显示它。

标签: java android


【解决方案1】:

根据我的心态应用程序,Resources 存在问题。

如果您通过按Menu键访问Resources,请使用以下代码准备资源。

DisplayMetrics mMetrics = new DisplayMetrics();
Activity act = (Activity)mContext;
mContext.getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
AssetManager mgr = context.getAssets();
Resources mResources = new Resources(mgr, mMetrics, act.getResources().getConfiguration());

现在访问这里资源

比如说:

String color = mResources.getString(R.string.application_name);

希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    我终于通过替换我的 Theme 父级来修复它

    <style name="MyTheme" parent="@android:style/Theme.Material" />
    

    <style name="MyTheme" parent="@android:style/Theme.DeviceDefault" />
    

    在我的 theme.xml 中。

    似乎并非所有三星设备都正确支持 Android 默认主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多