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

Android ViewPager以编程方式设置当前页面,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我编写了一个自定义的ViewPager来禁用滑动滚动,但我想通过编程方式滑动。我的视图页面中有三个选项卡,但是当我在第一个片段上调用viewPager.setCurrentItem(viewPager.getCurrentItem()+1)时,它会移动到第三个片段,而不是第二个片段。如果我在第二个片段中调用相同的函数,它将转到第三个。如果我在第三个片段中调用(viewPager.getCurrentItem()-1)`的话,它可以通过向后移动来正常工作。任何帮助都将不胜感激。我的代码如下: 不可

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

不可擦除的可视寻呼机

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_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    app:swipeable="false" />

在您的页面实践中使用

    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) {
        }
    });

其中idx是基于0的整数。

请尝试以下操作:

  viewPager.postDelayed(new Runnable() {

    @Override
    public void run() {
        viewPager.setCurrentItem(position);
    }
}, 10);
有时,viewpager上的setCurrentItem不起作用。因为寻呼机的内容是由旋转器控制的。微调器和寻呼机状态都在恢复时恢复,因此在下一个事件传播周期中调用了微调器和选定的侦听器


通过使用handler,我们可以做到这一点,因为它在触发onItemSelected事件后将寻呼机设置为当前位置。

您确定当您按下MenuNet按钮时,第一个按钮位于索引0处的片段上吗?我想我记得在某个时候像这样使用它时会出现一些类似的奇怪情况。我记不起决议是什么了。你试过把声明分开吗?int currentItem=pages.getCurrentItem();currentItem++;页面。设置当前项(当前项);我是。我试图通过
Log.e(“PAGES:”,String.valueOf(pager.getCurrentItem())记录它有趣的是,如果我在第二个选项卡上,移动到第三个选项卡,它不会记录。但是,如果我在第一个选项卡上并单击第三个选项卡,它会将页面记录为
2
@JohnP。同样的事情。移到第三页问题是ViewPager以编程方式设置当前页面,因此这应该是可接受的答案!有没有办法制作动画?花了一个小时试图找出setCurrentItem为什么在同一页上显示这两个片段。这个修好了!对于我自己来说,没有这个额外的延迟,“setCurrentItem”不起作用
    @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);

   }
viewPager.setCurrentItem(idx);
  viewPager.postDelayed(new Runnable() {

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