ViewPager 以编程方式设置当前页面

Posted

技术标签:

【中文标题】ViewPager 以编程方式设置当前页面【英文标题】:ViewPager set current page programmatically 【发布时间】:2015-05-12 04:10:19 【问题描述】:

我写了一个自定义ViewPager 来禁用Swipe Scroll,但我想以编程方式滑动。我的视图寻呼机中有三个Tab,但是当我在第一个Fragment 上调用viewPager.setCurrentItem(viewPager.getCurrentItem()+1) 时,它会移动到第三个Fragment 而不是第二个Fragment。如果我在第二个Fragment 中调用相同的函数,它会转到第三个。如果我在第三个片段中调用 (viewPager.getCurrentItem()-1)`,它可以通过向后移动来正常工作。任何帮助,将不胜感激。我的代码如下:

NonSwipeAbleViewPager

public class NonSwipeableViewPager extends ViewPager 

private boolean swipeable;

public NonSwipeableViewPager(Context context, AttributeSet attrs) 
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
    try 
        swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
     finally 
        a.recycle();
    


@Override
public boolean onInterceptTouchEvent(MotionEvent event) 
    return swipeable ? super.onInterceptTouchEvent(event) : false;


@Override
public boolean onTouchEvent(MotionEvent event) 
    return swipeable ? super.onTouchEvent(event) : false;


XML 声明

<co.example.customview.NonSwipeableViewPager
    android:id="@+id/pager"
    android:layout_
    android:layout_
    android:layout_weight="1"
    app:swipeable="false" />

调用它

 @Override
public boolean onOptionsItemSelected(MenuItem item) 
    switch (item.getItemId()) 
        case R.id.menuNext:
            NonSwipeableViewPager pages = (NonSwipeableViewPager) getActivity().findViewById(R.id.pager);
            pages.setCurrentItem(pages.getCurrentItem()+1, true);
            break;
        default:
            return super.onOptionsItemSelected(item);
    
    return super.onOptionsItemSelected(item);

【问题讨论】:

你确定当你按下 menuNext 按钮时,你是在索引 0 的片段上的第一个按钮吗? 我想我记得在某些时候像这样使用它时有一些类似的奇怪之处。我只是不记得决议是什么。 你试过分离语句吗? int currentItem = pages.getCurrentItem();当前项目++; pages.setCurrentItem(currentItem); 我是。我试图让Log.e("PAGES:", String.valueOf(pager.getCurrentItem())); 记录它 有趣的是,如果我在第二个选项卡上并移动到第三个选项卡,它不会记录。但是,如果我在第一个并单击第三个选项卡,它将页面记录为 2 @JohnP。一样。移动到第三页 【参考方案1】:
viewPager.setCurrentItem(idx);

其中 idx 是基于 0 的整数。

【讨论】:

问题是 ViewPager set current page programatically ,因此这应该是公认的答案!【参考方案2】:

在你的 PagerActivity 中使用

    viewPager = (ViewPager) findViewById(R.id.view_pager);
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() 
        @Override
        public void onPageSelected(int position) 
            int pagei = position + 1;
            pages=pagei + "";

            Toast.makeText(PagerActivity.this, getString(R.string.changeinfopage) + " " + pages, Toast.LENGTH_SHORT).show();
        

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
        

        @Override
        public void onPageScrollStateChanged(int state) 
        
    );

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 


        switch (item.getItemId()) 

            case R.id.action_previous:

                viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
                return true;

            case R.id.action_next:

                viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                return true;
        

        return super.onOptionsItemSelected(item);

   

【讨论】:

有什么方法可以制作动画吗?【参考方案3】:

试试这个:

  viewPager.postDelayed(new Runnable() 

    @Override
    public void run() 
        viewPager.setCurrentItem(position);
    
, 10);

有时,viewpager 上的 setCurrentItem 不起作用。由于寻呼机的内容由微调器控制。微调器和寻呼机状态都恢复了 onResume,因此在下一个事件传播周期期间调用了微调器 onItemSelected 侦听器。

通过使用处理程序,我们可以完成这项工作,因为它在 onItemSelected 事件触发后设置寻呼机当前位置。

【讨论】:

浪费了一个小时试图找出为什么 setCurrentItem 在同一页面上显示两个片段。这解决了它! 我自己没有这个额外的延迟“setCurrentItem”没有工作

以上是关于ViewPager 以编程方式设置当前页面的主要内容,如果未能解决你的问题,请参考以下文章

Jquery Bootgrid - 以编程方式更改当前页面

Android仿IOS ViewPager滑动进度条

有没有办法以编程方式设置 SiteMapPath 控件的当前节点?

尝试自动刷新当前页面视图时从ViewPager获取下一页面视图

Android编程心得-使用ActionBar+Fragment+ViewPager实现动态切换Menu效果

以编程方式获取当前页面