我有一个viewpager,它包含一些信息,但它让我从左到右滑动页面我怎样才能让它从左到右滑动,这意味着改变它的方向?
14 回答
我认为您可以使用将当前页面设置为最后一页viewPager.setCurrentItem()
。然后它会从左向右滑动.. :)
这是改变 Viewpager 的滑动方向的非常简单的技术。
有两个简单的步骤必须跟随你,
1.改变View pager的旋转,
viewpager.setRotationY(180);
2.然后再次改变片段容器的方向,它是viewpager的孩子,
recyclerView.setRotationY(180);
注意:就我而言,我使用 recyclerview 作为视图寻呼机的子级。
这对我来说是 100% 的。
您已经可以双向滑动了。默认情况下,它显示第 0 页,但您可以更改它:
protected void onCreate(Bundle savedInstanceState) {
// ...
viewPager.setCurrentItem(myFragmentCount-1);
// ...
如果您支持 API28 及更高版本,请不要对 ViewPager 使用旋转,因为它会使 ViewPager 在 android pie 上滑动太困难,请参阅此问题。这个库帮助我实现了 RTL ViewPager https://github.com/duolingo/rtl-viewpager
将其添加到依赖项并确保将 layoutDirection="locale" 添加到 RtlViewPager
<com.duolingo.open.rtlviewpager.RtlViewPager
android:layoutDirection="locale"
android:keepScreenOn="true"
android:id="@+id/quranViewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
/>
更新
ViewPager2 对区域设置友好,因此它会根据当前设备区域设置自动更改滑动方向。
有关 ViewPager2 实现的一些有用链接:
我确定它与操作无关,但我找到了一个对我有用的解决方案(因为修改数据对我来说是个问题)。我只是在 Y 轴上将 viewpager 旋转了 180 度,然后在 180 中再次旋转了它的子视图。
android.view.View
public void setRotationY(float rotationY)
希望它对任何人都有帮助,因为我认为这是最接近 Android 在更改为 rtl 语言时镜像所有操作系统的方式。
你可以做这样的事情,
ViewPager.setCurrentItem(lastposition);
我的解决方案。动态:
public class RTLViewPager extends ViewPager {
public RTLViewPager(Context context) {
super(context);
}
public RTLViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setAdapter(PagerAdapter adapter) {
super.setAdapter(adapter);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
if(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL){
setCurrentItem(adapter.getCount()-1);
}
}
}
}
我知道这个问题很老,但这是我的版本:
为了让您的 viewpager 滑动 RTL ,无论它里面是否有片段或视图,您都需要执行以下操作
第一步:定义一个整数:R.integer.angle_rotation_for_rtl
因为values
它是0
因为values-rtl
它是180
第2步:
viewPager.setRotationY(getResources().getInteger(R.integer.angle_rotation_for_rtl));
第 3 步:
viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
page.setRotationY(getResources().getInteger(R.integer.angle_rotation_for_rtl));
}
});
结果 - 一个流畅工作的浏览器,没有额外的 ifs
首先,您需要在您的类中实现 OnPageChangeListener,然后将侦听器设置为您的 viewpager,例如 viewpager.setOnPageChangeListener(yourclass.this); 希望这会奏效。
在布局中:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layoutDirection="rtl">
<androidx.viewpager.widget.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="locale"/>
</LinearLayout>
在代码中:
//region swipe right to left
pager.setRotationY(180);
pager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
page.setRotationY(180);
}
});
//endregion
您没有任何第三方库。Android 最近添加了一个名为 ViewPager2 的新 UI 组件,它支持 RTL View Pager。
https://developer.android.com/jetpack/androidx/releases/viewpager2
请在下面找到答案的链接。答案是关于迁移指南和示例 github 应用程序以支持 RTL 视图寻呼机。
为了让您的水平 ViewPager 在 LayoutDirection 更改时表现得像 RecyclerView ,只需将此方法添加到您的自定义 ViewPager ;
public class LoopViewPager extends ViewPager {
....
...
public void setLayoutDirection(int layoutDirection) {
if(layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
setRotationY(0);
}
else if(layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL) {
setRotationY(180);
}
}
并在哪里使用 viewPager 像这样动态设置它;
viewPager.setLayoutDirection(context.getResources().getConfiguration().getLayoutDirection());
如果你想从左向右移动 -> viewPager.setCurrentItem(viewPager.currentItem+1,true)
//传递布尔值以实现平滑滚动 如果你想从右向左移动 ->
viewPager.setCurrentItem(viewPager.currentItem-1)
//不平滑滚动
我完全理解这个问题得到了完美的回答;但是如果你使用的是 RTL 语言;例如,如果您有一本书要在 ViewPager 中显示;那么除了答案之外,您还可以考虑将页面翻过来以获得正确的页面;为此修改您的 ViewPager 适配器的getItem()
方法
@Override
public Fragment getItem(int position) {
return SomeFragment.newInstance(N_PAGES - position - 1); // to filp the pages
}