Необычный сбой при перемещении между фрагментами с использованием BottomNavigationView - PullRequest
0 голосов
/ 18 января 2019

У меня в активности Android есть BottomNavigationView, который состоит из 4 элементов меню.Когда я иногда перемещаюсь между этими фрагментами, приложение вылетает с исключением нулевого указателя.А в моем разделе диагностики AppCentes говорится, что сбой произошел внутри FragmentManager.Исключением является то, что есть метод getClass () для нулевого объекта.Кто-нибудь может указать причину, которая может быть за этим поведением?Прикрепление журнала сбоя.

enter image description here

Код переключения фрагментов приведен ниже.MS AppCenter:

JniEnvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args)
JNIEnv.CallObjectMethod (System.IntPtr jobject, System.IntPtr jmethod, Android.Runtime.JValue* parms)
FragmentTransactionInvoker.Replace (System.Int32 containerViewId, Android.Support.V4.App.Fragment fragment, System.String tag)
BookshelfActivity.BottomNavigationItemSelected (System.Object obj, Android.Support.Design.Widget.BottomNavigationView+NavigationItemSelectedEventArgs args)
BottomNavigationView+IOnNavigationItemSelectedListenerImplementor.OnNavigationItemSelected (Android.Views.IMenuItem item)
BottomNavigationView+IOnNavigationItemSelectedListenerInvoker.n_OnNavigationItemSelected_Landroid_view_MenuItem_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_item)
(wrapper dynamic-method) System.Object.26(intptr,intptr,intptr)
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:392)
android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:439)
mono.android.support.design.widget.BottomNavigationView_OnNavigationItemSelectedListenerImplementor.n_onNavigationItemSelected(Native Method)
mono.android.support.design.widget.BottomNavigationView_OnNavigationItemSelectedListenerImplementor.onNavigationItemSelected(BottomNavigationView_OnNavigationItemSelectedListenerImplementor.java:30)
android.support.design.widget.BottomNavigationView$1.onMenuItemSelected(BottomNavigationView.java:182)
android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
android.support.design.internal.BottomNavigationMenuView$1.onClick(BottomNavigationMenuView.java:95)
android.view.View.performClick(View.java:6935)
android.view.View$PerformClick.run(View.java:26211)
android.os.Handler.handleCallback(Handler.java:790)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:164)
android.app.ActivityThread.main(ActivityThread.java:7000)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

1 Ответ

0 голосов
/ 19 января 2019

Я подозреваю, что ваши фрагменты собирают мусор на Android, что вызывает эту проблему.

Вы не должны хранить ссылки на свои фрагменты, чтобы переключать вкладки. FragmentManager имеет встроенный механизм кэширования, которым вы можете воспользоваться.

Вы уже помечаете свои фрагменты. Вы можете использовать это для поиска фрагментированного кэша внутри менеджера фрагментов и, если он пуст, создайте новый:

var cachedFragment = SupportFragmentManager.FindFragmentByTag(fragmentTag);
if (cachedFragment == null){
    cachedFragment = new MyFragment(); //or whatever fragment you are trying to show
}

SupportFragmentManager
    .BeginTransaction()
    .SetCustomAnimations(Resource.Animation.fab_slide_in_from_right, Resource.Animation.fab_slide_out_to_left)
    .Replace(Resource.Id.content_frame, cachedFragment, fragmentTag)
    .AddToBackStack(null) //this caches the fragment
    .Commit();
...