当前位置: 首页 > 知识库问答 >
问题:

Android ViewPager - 如何将当前页面带到顶部?

窦涵忍
2023-03-14

我有一个带有负页边空白的ViewPager/FragmentPagerAdapter组合,这样页面之间会稍微有些重叠。问题是,中间的页面不在最上面。它左边的一页遮住了它。我希望它使中心页面总是显示在顶部。有没有一种优雅的方式来做到这一点?

共有1个答案

寿卜鹰
2023-03-14

页面的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
        }
    }
}
 类似资料:
  • 问题内容: 我目前正在等待一个非常重要的公告,并且我已经创建了一个简单的应用程序,每隔30分钟检查一次公告是否发布 发布公告后,我希望弹出一个窗口并通知我。该窗口只是一个简单的JFrame,其中包含一些文本。 我有一堂课,叫做公告。 在此类内,我为框架定义了另一个称为Form的类,因此我有类似以下内容: toFront函数根本不起作用。 例如,我要执行的操作是:在浏览时,我要弹出该窗口并将焦点设置

  • 我试图让jquery在每次有人单击导航按钮时移动到页面顶部。 当点击某个按钮时,它会隐藏旧的内容并显示新的内容,但它不会重置浏览器滚动位置,因此最终用户会感到有点困惑。 所以我想添加一些JS命令来解决这个问题,但这只在第一次执行时起作用。 我的代码:

  • 我和拉威尔3一起工作。我有一个动作按钮,将打开一个弹出模式。 我有一个设备列表。第一页,弹出模式在那里。但对于第二页,弹出模式不出来,但它重定向回第一页。 index.blade.php代码: {{HTML::link(“设备#openProfile”,“强制配置文件”,数组(“id”)= JS: 函数openImposeProfile(id){ document.getElementById("

  • 问题内容: 首先,我正在使用d3.js在数组中显示不同大小的圆圈。在鼠标悬停时,我希望将鼠标悬停的圆圈变大,我可以这样做,但是我不知道如何将其置于最前面。目前,一旦渲染,它就隐藏在其他多个圈子的后面。我怎样才能解决这个问题? 这是一个代码示例: 我尝试使用排序和排序方法,但是它们没有用。我敢肯定我没有正确地做。有什么想法吗? 问题答案: 您将不得不更改对象的顺序,并使鼠标悬停的圆圈成为最后添加的元

  • 问题内容: 有没有一种方法可以使用JavaScript / jQuery控制浏览器滚动? 当我向下滚动页面一半,然后触发重新加载时,我希望页面进入顶部,但它会尝试找到最后一个滚动位置。所以我这样做: 但是没有运气。 编辑 : 因此,当页面加载后,我打电话给您时,您的两个答案都有效。但是,如果我只是在页面上刷新,则看起来浏览器会在事件发生后计算并滚动到其旧的滚动位置(我也测试了body onload

  • 非常奇怪。例如,假设一个名为“rv”的。 > 如果现在项目10位于当前的下,请调用,回收视图将项目10滚动到底部。 如果现在项目10位于当前的中,请调用,不会进行任何滚动,不会执行任何操作。 如果现在项目10位于当前的顶部,请调用,回收视图将滚动项目10至顶部。 但我需要的是,无论何时调用它,都会将假定的位置滚动到当前视图的顶部,就像案例3一样。怎么做?