0

编辑:将构建工具版本从 23 升级到 27 后问题解决。

我有以下代码片段:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.findItem(R.id.shareMenuItem).getActionView().setOnClickListener(onShareMenuItemClickedListener);
}

最近我在 Crashlytics 上遇到了一些错误,其中包括 menu.findItem(...) 行:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke interface method 'android.view.View android.view.MenuItem.getActionView()' on a null object reference
   at pl.application.ProductViewFragment.onCreateOptionsMenu(SourceFile:434)
   at android.support.v4.app.Fragment.performCreateOptionsMenu(SourceFile:2186)
   at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(SourceFile:2250)
   at android.support.v4.app.FragmentController.dispatchCreateOptionsMenu(SourceFile:328)
   at android.support.v4.app.FragmentActivity.onCreatePanelMenu(SourceFile:363)

该问题不是确定性的,仅在 Android Oreo 上显示(通过 Fabric - 100% 的崩溃发生在 Android 8.0,不同的设备上)。我以前从来没有遇到过这条线的问题。Android 8.0 中是否有任何重要的变化能够导致 NPE?我尝试在我的小米米 A1 上重现它,但没有任何效果。或者也许有解决方法?

谢谢!

// 编辑:添加 xml 菜单文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:res="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/breadcrumbsMenuItem"
    android:icon="@drawable/ic_breadcrumbs"
    android:title="@string/breadcrumbs"
    res:showAsAction="always" />

<item
    android:id="@+id/shareMenuItem"
    android:icon="@drawable/ic_menu_share"
    android:title="@string/share"
    res:actionLayout="@layout/layout_share_button"
    res:showAsAction="always" />

</menu>
4

2 回答 2

0

我不确定你从哪里得到res:...,但我认为应该是app:...

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:res="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/breadcrumbsMenuItem"
    android:icon="@drawable/ic_breadcrumbs"
    android:title="@string/breadcrumbs"
    app:showAsAction="always" />

<item
    android:id="@+id/shareMenuItem"
    android:icon="@drawable/ic_menu_share"
    android:title="@string/share"
    app:actionLayout="@layout/layout_share_button"
    app:showAsAction="always" />

</menu>
于 2018-04-03T15:10:57.100 回答
0

试着添加这样的东西,看看它是否仍然为空

Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
    public void run()
    {
        menu.findItem(R.id.shareMenuItem).getActionView().setOnClickListener(onShareMenuItemClickedListener);
    }
}, 2000);

如果这解决了问题,那么他为 null 的原因是它仍然没有被创建并且你区域所有的 rdy 都试图访问它

当我尝试根据程序启动时获得的一些信息更改菜单图标的颜色时,我确实遇到了问题,并且“work arround”解决了我的问题

于 2018-04-03T14:16:39.493 回答