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

时间:2012-08-23 09:48:03

标签: android android-fragments android-viewpager commonsware

有些信息表明,在许多来源ViewPagerFragment无法使用ViewPager,例如Mark Murphy的“The Busy Coders Guide for Android Developers”,或者像this这样的帖子。我很困惑,因为我没有遇到这样的问题而且我在Fragment内成功使用了ViewPager。唯一的区别是我实例化的onCreateView()不在onActivityCreated()方法中,而是在onActivityCreated()中。一切都很好。

所以问题是 - 可能我只是不知道某些事情,因为某些原因不建议在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; } } } 中进行UI实例化?但是又一次 - 一切正常。

以下是类和xml的列表:

类:

<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>

布局:

{{1}}

4 个答案:

答案 0 :(得分:69)

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

我希望这对你们有所帮助。

答案 1 :(得分:61)

更新:由于最初编写此答案,您现在可以拥有嵌套片段,这意味着可以使用ViewPager使用片段本身就是一个片段。 This sample project演示了这项技术。

我现在回复你定期安排的答案,全文展示......


从书中引用自己:

  

使用ViewPager的最简单方法是将页面片段放入和放出   基于用户滑动的屏幕。这仅适用于未包含ViewPager本身的情况   在片段中,因为你不能将片段嵌套在其他片段中。

引用Dianne Hackborn

  

目前不支持嵌套片段。试图将片段放在另一个片段的UI中会导致未定义且可能破坏的行为。

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

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

答案 2 :(得分:4)

在为ViewPager初始化SetionPageAdapter时使用&#34; getChildFragmentManager()&#34;。

  

mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());

答案 3 :(得分:0)

可以尝试执行此代码并保存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);
    }
}