2013-11-25 35 views
2

我有一個ViewPager/FragmentPagerAdapter組合具有負頁邊距,以便頁面稍微重疊。問題是,中心頁面不在頂部。它左側的頁面遮擋了它。我希望它的中心頁面總是顯示在最上面。有沒有一個優雅的方式來做到這一點?Android ViewPager - 如何將當前頁面置頂?

回答

4

頁面的z順序是由它們的創建順序決定的,所以後一頁將停留在之前創建的頁面的頂部(請參閱下面的第一張圖片)。

在正常情況下,這不應該是任何問題,因爲頁面沒有重疊區域並排排列,所以z順序並不重要。但是,對於具有負邊距(重疊)的多個可見頁面,選定頁面可能會被旁邊的頁面部分阻擋。

解決此問題的一種方法是在實例化過程中保留頁面的引用,並使用它來改變它的z順序,使用view.bringToFront()

view pager instantiation order select page blocked view reorder z

爲了把這個代碼:

public class MyActivity extends Activity { 

    private ViewPager vp = null; 
    private SparseArray<View> viewCollection = new SparseArray<View>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 
     vp = (ViewPager)findViewById(R.id.viewpager); 
     vp.setPageMargin(-20); 
     vp.setOffscreenPageLimit(3); 
     vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener(){ 
      @Override 
      public void onPageSelected(int pos) { 
       View view = viewCollection.get(pos); // @@@ Get target page reference 
       view.bringToFront();     // @@@ change z-order to the top 
      } 
     }); 
     vp.setAdapter(new MyAdapter()); 
    } 

    public class MyAdapter extends PagerAdapter { 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      View pageLayout = getLayoutInflater().inflate(R.layout.page_layout, container, false); 
      final Integer pageId = position; 
      TextView pageText = (TextView)pageLayout.findViewById(R.id.page_id); 
      pageText.setText(String.valueOf(position)); 
      pageText.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        vp.setCurrentItem(pageId);   // @@@ select the clicked page 
       } 
      }); 
      // paint gray shades onto the page background 
      pageLayout.setBackgroundColor(Color.argb(255, position*40, position*40, position*40)); 

      viewCollection.put(position, pageLayout); // @@@ store the reference 
      container.addView(pageLayout); 
      return(pageLayout); 
     } 

     @Override 
     public int getCount() { 
      return 8; // any arbitrary number 
     } 

     @Override 
     public float getPageWidth(int position) { 
      return(0.33f); 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object obj) { 
      return (view == obj); 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      container.removeView((View)object); 
      viewCollection.remove(position);   // @@@ remove the reference 
     } 
    } 
} 
+0

哦兄弟。你很棒。我試圖在viewpager中實現這三天,但無法獲得它。你救我。非常非常感謝。 – Jone

+2

任何想法如何使用FragmentPagerAdapter而不是PagerAdapter完成同樣的事情? – mcdonaldjosh

相關問題