【问题标题】:Android: 2 Fragments sharing same ViewPager XML layoutAndroid:2 个片段共享相同的 ViewPager XML 布局
【发布时间】:2013-04-03 17:44:31
【问题描述】:

我有一个布局,其中包含 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;
    }

    ...

}

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

【问题讨论】:

  • 你应该把 Viw=ewPage 放在线性/相对布局下。另外,你能不能把 SectionsPagerAdapter 的代码放上去,因为 getItem 函数很有趣
  • 我认为使用线性/相对布局是对的。我已经放了 SectionsPagerAdapter 的代码。可能是问题在于他们使用相同的FragmentManager 实例?
  • 我认为,行 Fragment fragment = new SuperclassFragment();是问题。 View Paget 会调用 getItem 方法,此时,你返回的是 SuperclassFragment。它是一个父类,因此 View Pager 不知道要渲染哪个片段,它会使用它在类路径中找到的第一个片段,但我不确定
  • 不,如果你是这个意思,它不是抽象类。这个名字有点误导,但它只是一个普通的public static class SuperclassFragment extends Fragment,它与使用 ADT Eclipse 的 Activity 向导生成 ViewPager 导航时得到的DummySectionFragment 基本相同。

标签: android android-fragments android-viewpager android-xml


【解决方案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。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      完全可以将 ViewPager 放在 Fragment 中,这么久 因为 ViewPager 的内容本身不包含片段。 由于 PagerAdapter 的具体实现由 Android支持包使用片段,你必须自己滚动 无片段 PagerAdapter 将 ViewPager 放入片段中。

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

      Why it is not possible to use ViewPager within a Fragment? It actually is

      ViewPager inside fragment issue

      【讨论】:

      • 这对我的问题没有帮助。显然,确实可以将 ViewPager with Fragments 放在 Fragment 中。对于第一个它完美地工作,只是第二个不起作用,我不清楚为什么会出现这种行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多