为什么在片段中不能使用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); } }