2013-04-03 86 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的不同。