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);
Если это решит проблему, то причина, по которой он будет нулевым, заключается в том, что он все еще не создан, и вы пытаетесь получить к нему доступ.
У меня действительно была проблема, когда я пытался изменить цвет значка моего меню в соответствии с некоторой информацией, которую он получает, когда программа запускается, и эта "работа вокруг" устраняет проблему для меня