2013-04-03 50 views
3

我有一个活动,其中包含2个片段相邻的布局。在每个片段中,我有一个ViewPager。由于我需要两个片段看起来相同的方式,我使用相同的布局XML,其中包含一个ViewPager。Android:2片段共享相同ViewPager XML布局

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

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

了2个片段在活动分享看起来像这样的布局:

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

两个片段实例化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; 
    } 

    ... 

} 

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

+0

您应该将Viw = ewPage放在线性/相对布局下。此外,你可以请把SectionsPagerAdapter代码,因为它是有趣的看到getItem函数 – Amit

+0

随着线性/相对布局你是对的,我想。我已经把SectionsPagerAdapter的代码。可能问题是他们使用相同的'FragmentManager'实例? – Terry

+0

我觉得,line Fragment fragment = new SuperclassFragment();是问题。 View Paget将调用getItem方法,此时,您将返回SuperclassFragment。它是一个父类,因此View Pager不知道要渲染哪个片段,它将使用它在classpath中找到的第一个片段,但我不确定 – Amit

回答

1

我自己解决了这个问题,不是把ViewPage放到片段中,而是直接把它们放到活动的布局中。

活动的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> 
... 

本身实际上创建了2个不同的ViewPager对象活动使用它,都显示其片断预期。

我还不确定是什么导致了这个bug。如果有人提出了一个很好的解释,我愿意接受这个答案。

0

通过将ViewPager放置在Fragment的布局中,您试图在片段中添加子片段。嵌套片段只支持从4.2开始,现在它也被加入到支持库中。

为了支持View Pager内幕的片段,您需要实现自己的PagerAdapter版本。从SO职位之一,

完全有可能把一个ViewPager片段里面,只要 作为ViewPager的内容文件本身并不包含片段。 由于 Android支持包提供的PagerAdapter的具体实现使用片段,因此您必须滚动您自己的 无碎片PagerAdapter才能将ViewPager放入片段中。

下面是几个帖子里面描述

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

ViewPager inside fragment issue

+0

这对我的问题没有帮助。显然,将一个ViewPager _with_ Fragments放在片段内的确是可能的。对于第一个它完美的工作,只是第二个不会工作,并不清楚为什么这种行为。 – Terry

1

FragmentPagerAdapter依靠ViewPager ID /页项目ID的组合问题和可能的解决方案,以检查是否页项目需要被实例化(参见FragmentPagerAdapter.instantiateItem函数)。如果将ViewPager放入一个片段中,则View Pager的两个实例最终都会具有相同的ID,并且由于页面位置是该页面的默认ID,所以第二个ViewPager的页面从不会实例化。

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