2
我有一個ViewPager/FragmentPagerAdapter組合具有負頁邊距,以便頁面稍微重疊。問題是,中心頁面不在頂部。它左側的頁面遮擋了它。我希望它的中心頁面總是顯示在最上面。有沒有一個優雅的方式來做到這一點?Android ViewPager - 如何將當前頁面置頂?
我有一個ViewPager/FragmentPagerAdapter組合具有負頁邊距,以便頁面稍微重疊。問題是,中心頁面不在頂部。它左側的頁面遮擋了它。我希望它的中心頁面總是顯示在最上面。有沒有一個優雅的方式來做到這一點?Android ViewPager - 如何將當前頁面置頂?
頁面的z順序是由它們的創建順序決定的,所以後一頁將停留在之前創建的頁面的頂部(請參閱下面的第一張圖片)。
在正常情況下,這不應該是任何問題,因爲頁面沒有重疊區域並排排列,所以z順序並不重要。但是,對於具有負邊距(重疊)的多個可見頁面,選定頁面可能會被旁邊的頁面部分阻擋。
解決此問題的一種方法是在實例化過程中保留頁面的引用,並使用它來改變它的z順序,使用view.bringToFront()
。
爲了把這個代碼:
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
}
}
}
哦兄弟。你很棒。我試圖在viewpager中實現這三天,但無法獲得它。你救我。非常非常感謝。 – Jone
任何想法如何使用FragmentPagerAdapter而不是PagerAdapter完成同樣的事情? – mcdonaldjosh