3

我有一个布局,其中包含 2 个彼此相邻的片段。在每个片段中,我都有一个 ViewPager。由于我需要两个 Fragment 看起来相同,因此我对两者使用相同的布局 XML,其中包含一个 ViewPager。

现在,当我测试应用程序时,似乎只有第一个 Fragment 的 ViewPager 可以工作。第二个 Fragment 显示一个 PagerTitleStrip,我可以翻阅它,但它没有显示 ViewPager 中的 Fragments。

为什么第二个 ViewPager 也不显示片段?这是什么原因造成的?问题是他们使用相同的布局吗?无论如何,它不是一个不同的对象吗?

Activity 中的 2 个 Fragment 共享的布局如下所示:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/search_mapping_pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />

</android.support.v4.view.ViewPager>

两个 Fragment 都以相同的方式实例化 ViewPager:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_search_mapping,
            container, false);

    mSectionsPagerAdapter = new SectionsPagerAdapter(mActivity
            .getSupportFragmentManager());
    mViewPager = (ViewPager) view.findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    return view;
}

编辑:更多代码显示我的SectionsPagerAdapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new SuperclassFragment();
        Bundle args = new Bundle();
        args.putInt(SuperclassFragment.ARG_SECTION_NUMBER, position + 1);
        fragment.setArguments(args);
        return fragment;
    }

    ...

}

我应该在哪里寻找错误原因的任何提示?如有必要,我当然可以在此处包含更多代码。

4

3 回答 3

1

我自己解决了这个问题,没有将 ViewPagers 放入 Fragments,而是将它们直接放入 Activity 的布局中。

Activity 的 XML 布局如下所示:

...
<LinearLayout 
    android:id="@+id/search_fragment_layout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="horizontal">

    <android.support.v4.view.ViewPager
        android:id="@+id/objectPager"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.5"
        android:layout_margin="16dp" >
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/object_pager_title_strip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:background="#33b5e5"
            android:paddingBottom="4dp"
            android:paddingTop="4dp"
            android:textColor="#fff" />
    </android.support.v4.view.ViewPager>

    <android.support.v4.view.ViewPager
        android:id="@+id/actionPager"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.5"
        android:layout_margin="16dp" >
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/action_pager_title_strip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:background="#33b5e5"
            android:paddingBottom="4dp"
            android:paddingTop="4dp"
            android:textColor="#fff" />
    </android.support.v4.view.ViewPager>

</LinearLayout>
...

在 Activity 本身中使用它实际上会创建 2 个不同的 ViewPager 对象,并且都按预期显示它们的 Fragment。

我仍然不确定是什么导致了这个错误。如果有人提出了一个很好的解释,我愿意接受它作为答案。

于 2013-04-03T19:08:11.177 回答
1

FragmentPagerAdapter 依赖于 ViewPager id/Page Item id 的组合来检查页面项是否需要实例化(请参阅 FragmentPagerAdapter.instantiateItem 函数)。如果将 ViewPager 放入片段中,ViewPager 的两个实例最终将具有相同的 id,并且由于页面位置是页面的默认 id,因此第二个 ViewPager 的页面永远不会被实例化。

解决方法是以编程方式设置 ViewPager id:
viewPager.setId(myID++);
或覆盖适配器上的 getItemId,以便不同 ViewPager 的项目 id 不同。

于 2016-02-08T02:32:02.423 回答
0

通过将 ViewPager 放在 Fragment 的布局中,您正在尝试在片段中添加子片段。嵌套片段仅从 4.2 开始支持,现在它也添加到了支持库中。

为了支持 View Pager insider afragment,您需要实现自己的 PagerAdapter 版本。从 SO 帖子之一,

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

以下是一些描述问题和可能解决方案的帖子

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

ViewPager 内部片段问题

于 2013-04-04T05:25:49.820 回答