Привязка данных фрагмента просмотра пейджера при использовании кинжала в 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();
}
}