onCreateOptionsMenu вылетает только на Oreo

РЕДАКТИРОВАТЬ: Проблема решена после обновления версии Build Tools с 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? Я пытался воспроизвести его на моем Xiaomi Mi 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>

2 ответа

Я не уверен, где вы получите 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>

Просто попробуйте добавить что-то вроде этого, чтобы увидеть, будет ли оно все еще нулевым или нет

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

Если это решит проблему, то причина, по которой он будет нулевым, заключается в том, что он все еще не создан, и вы пытаетесь получить к нему доступ.

У меня действительно была проблема, когда я пытался изменить цвет значка моего меню в соответствии с некоторой информацией, которую он получает, когда программа запускается, и эта "работа вокруг" устраняет проблему для меня

Другие вопросы по тегам