Android ViewPager中的视图';s片段为空
我有一个MainActivity,它包含经典的抽屉布局,在这里单击抽屉项并将一个片段加载到主容器中。在应用加载时,我的“MapFragment”被加载到容器中。此片段包含一个底部页,其中包含一个Android ViewPager中的视图';s片段为空,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我有一个MainActivity,它包含经典的抽屉布局,在这里单击抽屉项并将一个片段加载到主容器中。在应用加载时,我的“MapFragment”被加载到容器中。此片段包含一个底部页,其中包含一个ViewPager,它有2个片段 如果我加载该应用程序,并通过单击抽屉项目导航到MapFragment之外,比如说“SupportFragment”,则该片段将加载到容器中。如果随后导航回MapFragment,则底部工作表ViewPager中包含的片段中的所有视图现在都为空 澄清一下,ViewPager
ViewPager
,它有2个片段
如果我加载该应用程序,并通过单击抽屉项目导航到MapFragment之外,比如说“SupportFragment”,则该片段将加载到容器中。如果随后导航回MapFragment,则底部工作表ViewPager
中包含的片段中的所有视图现在都为空
澄清一下,ViewPager
中的片段不是空的,但它们的所有视图都是空的
当前,使用以下代码在MapFragment的onCreate()
中设置ViewPager:
mBottomSheetViewPagerAdapter = new BottomSheetViewPagerAdapter(((MainActivity)getActivity()).getSupportFragmentManager());
mFirstFragment = new FirstFragment();
mFirstFragment.setListener(new FirstFragmentListener() {
//...listeners
});
mSecondFragment = new SecondFragment();
mSecondFragment.setListener(new SecondFragmentListener() {
//...listeners
});
mBottomSheetViewPagerAdapter.add(mFirstFragment);
mBottomSheetViewPagerAdapter.add(mSecondFragment);
mViewPager.setAdapter(mBottomSheetViewPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
为什么这些视图可能是空的
编辑:所以我发现了一些非常有趣的东西。我向父“MapFragment”和ViewPager中的一个片段(“FirstFragment”)的生命周期方法添加了日志语句。我注意到,在第一次启动MapFragment时,我会看到它的生命周期方法被打印出来,然后是位于ViewPager
中的子片段的方法。当我导航离开时,将调用MapFragment的onPause()
和onStop()
,但在ViewPager
中没有从子片段打印任何内容。然后,当我通过单击抽屉中的MapFragment选项导航回MapFragment时,我看到了MapFragment中的启动生命周期方法,但在ViewPager
中没有看到子片段
如果我重构ViewPager
中的子片段,以使用本机片段而不是支持片段,然后ViewPager
适配器从FragmentPagerAdapter的v13版本扩展,然后在实例化适配器时传入getChildFragmentManager
:mBottomSheetViewPagerAdapter=new BottomSheetViewPagerAdapter(getChildFragmentManager())代码>
这有一个有趣的效果,即运行ViewPager
中的子片段缺少生命周期方法,因此打印了相应的日志语句。为了说明所有这些,以下是启动应用程序、导航到其他片段,然后导航回原始片段时打印到logcat的内容摘要:
支持片段:
带有本机片段
但是,即使在第二次显式地看到子片段onCreateView()被调用时,如果我尝试访问任何视图(在本例中,调用一个在EditText
上调用setFocusable()
的方法),我也会得到一个NPE,因为它们不是initialized@LunarWatcher你能详细说明一下吗?它们在第一次加载“MapFragment”时初始化得很好。从我在代码片段中看到的情况来看,mViewPager和mTabLayout从未初始化过。它们通过Butterknife.oh绑定在类的顶部。没关系,因为他们不是initialized@LunarWatcher你能详细说明一下吗?它们在第一次加载“MapFragment”时初始化得很好。从我在代码片段中看到的情况来看,mViewPager和mTabLayout从未初始化过。它们通过Butterknife.oh绑定在类的顶部。那没关系
//App launched, default MapFragment loaded
MapFragment onCreate()
MapFragment onCreateView()
MapFragment onStart()
MapFragment onResume()
FirstFragment onCreate() called
FirstFragment onCreateView() called.
FirstFragment onStart() called.
FirstFragment onResume() called.
//Navigate to another fragment
MapFragment onPause()
MapFragment onStop()
//Use the drawer to navigate back to the MapFragment
MapFragment onCreateView()
MapFragment onStart()
MapFragment onResume()
//App launched, default MapFragment loaded
MapFragment onCreate()
MapFragment onCreateView()
MapFragment onStart()
MapFragment onResume()
FirstFragment onCreate() called
FirstFragment onCreateView() called.
FirstFragment onStart() called.
FirstFragment onResume() called.
//Navigate to another fragment
FirstFragment onPause() called.
MapFragment onPause()
FirstFragment onStop() called
MapFragment onStop()
//Use the drawer to navigate back to the MapFragment
MapFragment onCreateView()
FirstFragment onCreateView() called.
MapFragment onStart()
FirstFragment onStart() called.
MapFragment onResume()
FirstFragment onResume() called.