Привязка данных фрагмента просмотра пейджера при использовании кинжала в Android

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

У меня есть это исключение:

01-28 18:46:44.692 24073-24073/app.series.com.tvshowsapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: app.series.com.tvshowsapplication, PID: 24073
java.lang.RuntimeException: Unable to start activity ComponentInfo{app.series.com.tvshowsapplication/app.series.com.tvshowsapplication.ui.main.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentManager app.series.com.tvshowsapplication.ui.home.HomeFragment.getChildFragmentManager()' on a null object reference
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2946)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3046)
   at android.app.ActivityThread.-wrap11(Unknown Source:0)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1688)
   at android.os.Handler.dispatchMessage(Handler.java:105)
   at android.os.Looper.loop(Looper.java:164)
   at android.app.ActivityThread.main(ActivityThread.java:6809)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentManager app.series.com.tvshowsapplication.ui.home.HomeFragment.getChildFragmentManager()' on a null object reference
   at app.series.com.tvshowsapplication.ui.home.HomeFragmentViewModel.bindViewPagerAdapter(HomeFragmentViewModel.java:24)
   at app.series.com.tvshowsapplication.databinding.HomeFragmentBinding.executeBindings(HomeFragmentBinding.java:123)
   at android.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:379)
   at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:351)
   at app.series.com.tvshowsapplication.ui.base.BaseFragment.onViewCreated(BaseFragment.java:63)
   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1430)
   at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
   at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
   at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
   at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239)
   at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3231)
   at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3181)
   at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192)
   at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:572)
   at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
   at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1412)
   at android.app.Activity.performStart(Activity.java:7015)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2909)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3046) 
   at android.app.ActivityThread.-wrap11(Unknown Source:0) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1688) 
   at android.os.Handler.dispatchMessage(Handler.java:105) 
   at android.os.Looper.loop(Looper.java:164) 
   at android.app.ActivityThread.main(ActivityThread.java:6809) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
01-28 18:46:44.694 24073-24073/app.series.com.tvshowsapplication D/AppTracker: App Event: crash

Это мой HomeFragmentViewModel

@Module
public class HomeFragmentViewModel extends BaseViewModel<HomeNavigator>{

    public HomeFragmentViewModel()
    {
        super();
    }

    @BindingAdapter({"bind:handler"})
    public static void bindViewPagerAdapter(final ViewPager view, final HomeFragment homeFragment) {
        final HomeFragmentPagerAdapter adapter = new HomeFragmentPagerAdapter(view.getContext(), homeFragment.getChildFragmentManager());
        view.setAdapter(adapter);
    }

    @BindingAdapter({"bind:pager"})
    public static void bindViewPagerTabs(final TabLayout view, final ViewPager pagerView) {
        view.setupWithViewPager(pagerView, true);
    }

}

Исключение произошло, когда приложение пытается создать новый адаптер в ViewPager. Одним из аргументов функции bindViewPagerAdapter является HomeFragment, но привязка происходит в onCreateView, поэтому технически пока нет HomeFragment, что приводит к исключению нулевого указателя. Мне все равно нужно передать откуда-нибудь детского менеджера. Есть ли возможность вызвать привязку в onViewCreated вместо onCreateView или я что-то упустил.

Это код HomeFragment:

public class HomeFragment extends BaseFragment<HomeFragmentBinding, HomeFragmentViewModel> {

        public static final String TAG = "HomeFragment";

        @Inject
        HomeFragmentViewModel mHomeFragmentViewModel;


        public static HomeFragment newInstance() {
            Bundle args = new Bundle();
            HomeFragment fragment = new HomeFragment();
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public HomeFragmentViewModel getViewModel() {
            return mHomeFragmentViewModel;
        }

        @Override
        public int getBindingVariable() {
            return BR.viewModel;
        }

        @Override
        public int getLayoutId() {
            return R.layout.home_fragment;
        }


        @Override
        public void onDestroyView() {
            super.onDestroyView();
        }
    }

0 ответов

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