为什么在片段中不能使用ViewPager? 它实际上是

有资料显示,在Mark Murphy的“ Android开发者繁忙编码指南 ”等许多来源的Fragment中,不可能使用ViewPager ,或者在SO上发布这样的post。 我很困惑,因为我没有这样的问题,我成功地使用我的Fragment ViewPager 。 唯一的区别是我实例化一个ViewPager不在onCreateView()方法,但在onActivityCreated() 。 而且一切都很好。

所以问题是 – 可能我只是不知道的东西,这不build议出于某种原因,使onActivityCreated() UI实例? 但是再一次 – 一切正常。

这里是类和xml的列表:

类:

 public class ViewPagerFragment extends Fragment { static final int NUM_ITEMS = 2; private ViewPagerAdapter mAdapter; private ViewPager mPager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.view_pager_fragment, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new ViewPagerAdapter(getFragmentManager()); mPager = (ViewPager) getView().findViewById(R.id.pager); mPager.setAdapter(mAdapter); } public static class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int num) { if (num == 0) { return new ItemsListFragment(); } else { return new FavsListFragment(); } } @Override public int getCount() { return NUM_ITEMS; } } } 

布局:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout> 

更新 :由于这个答案是最初编写的,你现在可以有嵌套的片段,这意味着有可能有一个ViewPager使用片段的页面, 在一个片段本身。 这个示例项目演示了这种技术。

我现在把你定期回答你的答案,全部提交给你…


从书中引用自己:

使用ViewPager的最简单的方法是根据用户的滑动将页面分片放入和放出屏幕。 这只有在ViewPager本身不包含在片段中时才有效,因为您不能将片段嵌套在其他片段中。

引用Dianne Hackborn :

目前不支持嵌套片段。 试图在另一个片段的用户界面中放置一个片段将导致未定义的,可能的破坏行为。

只要ViewPager内容 本身不包含片段 ,将ViewPager放在Fragment内是完全可能的。 由于Android支持包提供的PagerAdapter的具体实现使用片段,因此您必须滚动您自己的无片段PagerAdapter才能将ViewPager放入片段中。

我将尽力在本书的下一版中更清楚地expression这一点(除非你是英国人,在这种情况下,我会尽力使这一点更加明确:-)。

要在片段中实现View寻呼机,请使用getChildFragmentManager()而不是getFragmentManager() 。 您可以从onCreateView()onActivityCreated()调用ViewPager的setAdapter () ,这不是问题。

我希望这会帮助你们。

在为ViewPager初始化SetionPageAdapter时,使用“getChildFragmentManager()”。

mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());

可以尝试执行此代码并保存view_pager_fragment.xml

 <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.TabLayout android:id="@+id/tab" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

ViewPagerFragment

 ViewPager viewPager; TabLayout tabLayout; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tracks, container, false); viewPager = (ViewPager) view.findViewById(R.id.viewpager); tabLayout = (TabLayout) view.findViewById(R.id.tab); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setupViewPager(viewPager); tabLayout.setupWithViewPager(viewPager); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());`` viewPagerAdapter.addFragment(new FirstFragment(), "First"); viewPagerAdapter.addFragment(new SecoundFragment(), "Secound"); viewPagerAdapter.addFragment(new LoginFragment(), "Login"); viewPager.setAdapter(viewPagerAdapter); } private class ViewPagerAdapter extends FragmentPagerAdapter { List<Fragment> fragmentList = new ArrayList<>(); List<String> fragmentTitles = new ArrayList<>(); public ViewPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return fragmentTitles.get(position); } public void addFragment(Fragment fragment, String name) { fragmentList.add(fragment); fragmentTitles.add(name); } }