ViewPager 以编程方式设置当前页面
ViewPager set current page programmatically
我写了一个自定义 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_width="match_parent"
android:layout_height="0dp"
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);
}
在您的 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);
}
viewPager.setCurrentItem(idx);
其中 idx 是基于 0 的整数。
试试这个:
viewPager.postDelayed(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(position);
}
}, 10);
有时,viewpager 上的 setCurrentItem 不起作用。由于寻呼机的内容由微调器控制。微调器和寻呼机状态都在恢复时恢复,因此在下一个事件传播周期中调用了微调器的 onItemSelected 侦听器。
通过使用处理程序,我们可以完成这项工作,因为它会在触发 onItemSelected 事件后设置寻呼机的当前位置。
我写了一个自定义 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_width="match_parent"
android:layout_height="0dp"
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);
}
在您的 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);
}
viewPager.setCurrentItem(idx);
其中 idx 是基于 0 的整数。
试试这个:
viewPager.postDelayed(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(position);
}
}, 10);
有时,viewpager 上的 setCurrentItem 不起作用。由于寻呼机的内容由微调器控制。微调器和寻呼机状态都在恢复时恢复,因此在下一个事件传播周期中调用了微调器的 onItemSelected 侦听器。
通过使用处理程序,我们可以完成这项工作,因为它会在触发 onItemSelected 事件后设置寻呼机的当前位置。