【问题标题】:how to make my viewpager swipe from right to left如何让我的浏览器从右向左滑动
【发布时间】:2013-09-13 08:43:03
【问题描述】:

我有一个 viewpager,它包含一些信息,但它可以让我从左到右滑动页面我怎样才能让它从左到右滑动,这意味着改变它的方向?

【问题讨论】:

  • 显示你尝试了什么?
  • 如果是浏览器,则可以双向滑动。
  • @GrlsHu 我尝试在 viewpager 中添加 android:layoutdirection="rtl" 然后 android:textdirection="rtl" 现在我正在使用起始位置,但不知道是否必须做吧..
  • @Basim Sherif 是的,我知道,但我需要它来开始从右向左滑动它开始从左向右滑动

标签: android android-viewpager


【解决方案1】:

我认为您可以使用viewPager.setCurrentItem() 将当前页面设置为最后一页。然后它会从左向右滑动.. :)

【讨论】:

  • 和反向添加片段流程:)
【解决方案2】:

改变Viewpager的滑动方向是非常简单的技术。

有两个简单的步骤必须跟随你,

1.改变View pager的旋转,

viewpager.setRotationY(180);

2.然后再改变viewpager的子片段容器的方向,

recyclerView.setRotationY(180);

注意:在我的例子中,我使用 recyclerview 作为视图分页器的子级。

这对我来说是 100% 的。

【讨论】:

  • 它也翻转了我的图像.. 文本也被翻转了......这不是正确的解决方案
  • 因为您可能只旋转了一次布局。你必须旋转两次。一旦父布局比子布局。当然,它会正常工作。
  • 如果所有分页器都使用片段并且所有片段都具有相同的基类,那么这是一个非常简单的解决方案,那么您可以旋转所有分页器以及作为分页器一部分的每个片段的视图。对我来说只有两行代码! :)
  • 这个方法在HUAWEI Nova Plus中出现问题,页面不显示!
  • 这是一个很好的解决方案,但你应该使用它。 mRecyclerView.setRotationY(180);对于内部回收者视图
【解决方案3】:

您已经可以双向滑动了。默认情况下它显示第 0 页,但您可以更改它:

protected void onCreate(Bundle savedInstanceState) {
    // ...
    viewPager.setCurrentItem(myFragmentCount-1); 
    // ...

【讨论】:

  • 谢谢,当 Anshish kumar 回答我时,我会这样做,将其标记为有用。希望这会给您加分。
  • 我更喜欢通过调用viewPager.setCurrentItem(myFragmentCount-1, false) 将平滑滚动设置为false 以立即过渡。
【解决方案4】:

如果您支持 API28 及更高版本,请不要在 ViewPager 中使用旋转,因为这会使 ViewPager 在 android pie 上滑动太困难,请参阅question。 这个库帮助我实现了 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 实现的有用链接:

Android docs

Sample

【讨论】:

    【解决方案5】:

    我确定它与操作无关,但我找到了一个对我有用的解决方案(因为修改数据对我来说是个问题)。 我只是在 Y 轴上将 viewpager 旋转了 180 度,然后将其子视图再次旋转了 180 度。

    android.view.View
    
    public void setRotationY(float rotationY)
    

    希望它对任何人都有帮助,因为我认为这是最接近 Android 在更改为 rtl 语言时镜像所有操作系统的方式。

    【讨论】:

    • 设置旋转将改变视图分页器内的文本也以 rtl 顺序显示。 {例如。 rightToLeft => tfeLoTthgir}
    • 所以你只需让视图页面适配器旋转子视图;)
    • 太棒了!开箱即用的纯粹思考。
    【解决方案6】:

    你可以这样做,

    ViewPager.setCurrentItem(lastposition);
    

    【讨论】:

      【解决方案7】:

      我的解决方案。动态:

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

      【讨论】:

        【解决方案8】:

        我知道这个问题很老,但这是我的版本:

        为了让您的 viewpager 滑动 RTL ,无论它里面是否有片段或视图,您都需要执行以下操作

        第 1 步: 定义一个整数: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));
        
                    }
                });
        

        结果 - 一个流畅工作的 viewpager ,没有额外的 ifs

        【讨论】:

          【解决方案9】:

          首先你需要在你的类中实现 OnPageChangeListener 然后将侦听器设置为您的 viewpager,例如 viewpager.setOnPageChangeListener(yourclass.this); 希望这会奏效。

          【讨论】:

          • 不抱歉,已经标记了正确答案,感谢您的帮助。
          【解决方案10】:

          在布局中:

             <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
          

          【讨论】:

            【解决方案11】:

            为了让您的水平 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());
            

            【讨论】:

              【解决方案12】:

              我完全理解这个问题得到了完美的回答;但是如果你使用的是 RTL 语言;例如,如果您有一本书要在 ViewPager 中显示;那么除了答案之外,您还可以考虑将页面翻过来以获得正确的页面;为此,请修改 ViewPager 适配器的 getItem() 方法

              @Override
              public Fragment getItem(int position) {
                  return SomeFragment.newInstance(N_PAGES - position - 1); // to filp the pages
              }
              

              【讨论】:

                【解决方案13】:

                您没有任何第三方库。 Android 最近添加了一个名为 ViewPager2 的新 UI 组件,它支持 RTL View Pager。

                https://developer.android.com/jetpack/androidx/releases/viewpager2

                请在下面找到答案的链接。答案是关于迁移指南和示例 github 应用程序以支持 RTL 视图分页器。

                https://stackoverflow.com/a/59558911/651377

                【讨论】:

                  【解决方案14】:

                  如果你想从左向右移动 -> viewPager.setCurrentItem(viewPager.currentItem+1,true)//传递布尔值以实现平滑滚动 如果你想从右向左移动 -> viewPager.setCurrentItem(viewPager.currentItem-1)//没有平滑滚动

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-03-17
                    相关资源
                    最近更新 更多