Android ViewPager-如何将当前页面置于顶部?

Android ViewPager-如何将当前页面置于顶部?,android,android-viewpager,Android,Android Viewpager,我有一个ViewPager/FragmentPagerAdapter组合,带有负页边距,这样页面之间会稍微重叠。问题是,中心页不在顶部。它左边的那一页把它遮住了。我希望它使中心页始终显示在顶部。有没有一种优雅的方法可以做到这一点?页面的z顺序由其创建顺序决定,因此后一个页面将位于前面创建的页面的顶部(请参阅下面的第一张图片)。 在正常情况下,这应该不会有任何问题,因为页面是并排排列的,没有重叠区域,所以z顺序并不重要。但是,如果有多个带负边距(重叠)的可见页面,则所选页面可能会被其旁边的页面

我有一个ViewPager/FragmentPagerAdapter组合,带有负页边距,这样页面之间会稍微重叠。问题是,中心页不在顶部。它左边的那一页把它遮住了。我希望它使中心页始终显示在顶部。有没有一种优雅的方法可以做到这一点?

页面的z顺序由其创建顺序决定,因此后一个页面将位于前面创建的页面的顶部(请参阅下面的第一张图片)。

在正常情况下,这应该不会有任何问题,因为页面是并排排列的,没有重叠区域,所以z顺序并不重要。但是,如果有多个带负边距(重叠)的可见页面,则所选页面可能会被其旁边的页面部分阻止。

克服此问题的一种方法是在实例化过程中保留页面的引用,并使用
view.bringToFront()
更改页面的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
        }
    }
}
公共类MyActivity扩展活动{
私有ViewPager vp=null;
私有SparseArray viewCollection=新SparseArray();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main_活动);
vp=(ViewPager)findViewById(R.id.ViewPager);
副总裁setPageMargin(-20);
setOffscreenPageLimit副总裁(3);
vp.setOnPageChangeListener(新建ViewPager.OnPageChangeListener()){
@凌驾
已选择页面上的公共无效(int pos){
View=viewCollection.get(pos);/@@@get目标页引用
view.bringToFront();/@@@将z顺序更改为顶部
}
});
vp.setAdapter(新的MyAdapter());
}
公共类MyAdapter扩展了PagerAdapter{
@凌驾
公共对象实例化项(视图组容器,int位置){
View pageLayout=GetLayoutFlater()。充气(R.layout.page\u布局,容器,false);
最终整数pageId=位置;
TextView pageText=(TextView)pageLayout.findViewById(R.id.page_id);
pageText.setText(String.valueOf(position));
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
vp.setCurrentItem(pageId);//@@选择单击的页面
}
});
//在页面背景上绘制灰色阴影
pageLayout.setBackgroundColor(Color.argb(255,位置*40,位置*40,位置*40));
viewCollection.put(位置、页面布局);/@@@存储引用
container.addView(页面布局);
返回(页面布局);
}
@凌驾
public int getCount(){
返回8;//任意数字
}
@凌驾
公共浮点getPageWidth(整型位置){
返回(0.33f);
}
@凌驾
公共布尔值isViewFromObject(视图,对象obj){
返回(视图==obj);
}
@凌驾
公共项(视图组容器、int位置、对象){
container.removeView((视图)对象);
viewCollection.remove(position);/@@@remove引用
}
}
}

哦,兄弟。你太棒了。我在viewpager中尝试了三天来实现这种“带到前台”的行为,但没有成功。你救了我。非常感谢。你知道如何用FragmentPagerAdapter代替PagerAdapter来完成同样的事情吗?