如何反转viewpager刷卡

时间:2017-05-13 12:02:59

标签: android android-fragments android-viewpager android-tablayout swipe-gesture

所以我的应用程序是RTL,有了这个,标签现在从右到左排序..!

..但是当我在标签之间滑动滑动时,它与常识相矛盾,所以我想要扭转它......!看图片看问题..!

我想要的是......! >当我在Tab1然后我从左向右滑动时我想让它滑到Tab 2等等......!

是可能的..!?

enter image description here

代码

我的客户ViewPager

public class CustomViewPager extends android.support.v4.view.ViewPager{
private boolean enabled;

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.enabled = true;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onTouchEvent(event);
    }

    return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onInterceptTouchEvent(event);
    }

    return false;
}

public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
 }
 }

我的TabActivity(帮助程序类)

  public class TabbedActivity extends BaseActivity { 

 //I extend BaseActivity to avoid repeating UI code like toolbar and stuff..

protected CustomViewPager viewPager;
public OrdersAdapter adapter;
public TabLayout tabs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    tabs.setTabGravity(TabLayout.GRAVITY_FILL);
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));


    tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            setTabSelected(tab);
        }


        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
  }


public void setTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());
}

public void addTab(int title) {

    tabs.addTab(tabs.newTab().setText(getString(title)));

}

}

我的包含Tablayout的活动,有三个片段,每个片段一个。

public class MyOrders extends TabbedActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_orders);

    tabs = (TabLayout) findViewById(R.id.tab_layout);
    addTab(R.string.NewOrderTabTitle); //tab1
    addTab(R.string.MyOrderTabTitle); // tab2
    addTab(R.string.FinOrderTabTitle); //tab3

     adapter = new OrdersAdapter(getSupportFragmentManager(), tabs.getTabCount());
    viewPager = (CustomViewPager) findViewById(R.id.pager);
    viewPager.setPagingEnabled(true);

    tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    super.onCreate(savedInstanceState);


 }
}

更新

@regev avraham

  

以相反的顺序添加选项卡,然后使用   viewPager.setCurrentItem(adapter.getCount() - 1);选择最后一个   标签

根据您的评论,这是我在具有tablayout

的活动中所做的
 //code...
 tabs = (TabLayout) findViewById(R.id.tab_layout);
    addTab(R.string.FinOrderTabTitle); //tab3
    addTab(R.string.MyOrderTabTitle); // tab2
    addTab(R.string.NewOrderTabTitle); //tab1
 //code...

 viewPager.setCurrentItem(adapter.getCount() - 1);

6 个答案:

答案 0 :(得分:3)

你可以查看这个Lib

https://github.com/diego-gomez-olvera/RtlViewPager

并实施如下

dependencies {
...
compile 'com.booking:rtlviewpager:1.0.1'
}
  

只需添加此项而不是Viewpager

<com.booking.rtlviewpager.RtlViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

答案 1 :(得分:2)

如果minSdkVersion为17岁以上,您可以对标签布局执行此操作:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

答案 2 :(得分:2)

这有点棘手,android viewPager从右到左有一个小bug,只有页面标题是从右到左,而页面本身没有。

为了解决这个问题,我所做的是使用常规的从左到右的布局并按相反的顺序添加标签,然后使用viewPager.setCurrentItem(adapter.getCount() - 1);选择最后一个标签。

这是结果的样子: https://drive.google.com/open?id=0B0FzrLgjet7pSE9lMFFFT0JiekE

其中size是第一个标签,显示是第二个,依此类推

要保持RTL行为和LTR行为,您应该使用它:

Configuration config = getResources().getConfiguration();
if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)
{
     //use the RTL trick here
}
else
{
     //use the regular case here
}

答案 3 :(得分:1)

我在开发 RTL 应用时遇到了这个问题。这是要做的事情:

  1. 以相反的顺序添加tabs
  

tabLayout.addTab(tabLayout.newTab()。setText(“ Tab2”);   tabLayout.addTab(tabLayout.newTab()。setText(“ Tab1”);

  1. 自定义ViewPager适配器以相反的顺序返回Fragments
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            Fragment2 f2 = new Fragment2();
            return f2;
        case 1:
            Fragment1 f1 = new Fragment1();
            return f1;
        default:
            return null;
    }
}
  1. OnCreate处选择最后一个标签索引:
TabLayout.Tab tab = tabLayout.getTabAt(1);
tab.select();
  1. TabLayout的方向设置为LTR:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}
  1. 最后,您的onTabSelected事件应如下所示:
public void onTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());
}

效果很好。

答案 4 :(得分:1)

现在,您可以使用类似的小部件(支持RTL分页滑动)以高效的方式进行操作。 它将根据系统本地自动更改滑动方向,也可以手动设置。

Android开发了一个名为ViewPager2

的新小部件

ViewPager2ViewPager的改进版本,它提供了 增强功能并解决使用中的常见困难 ViewPager

您可以按照以下简单步骤创建与ViewPager2集成的TabLayout

    layout_main.xml中的
  1. 使用此代码:

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
     <com.google.android.material.appbar.AppBarLayout
         android:id="@+id/app_bar_layout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
    
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:title="@string/app_name">
        </androidx.appcompat.widget.Toolbar>
    
        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary" />
    
    </com.google.android.material.appbar.AppBarLayout>
    
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutDirection="locale"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    
  2. 创建名称为PagerAdapter的适配器类:

    public class PagerAdapter extends FragmentStateAdapter {
        public PagerAdapter(FragmentActivity fm) {
            super(fm);
        }
    
        @NonNull
        @Override
        public Fragment createFragment(int position) {
            switch (position) {
                case 0:
                    return YourFragment1.newInstance();
                case 1:
                    return YourFragment2.newInstance();
            }
            return null;
        }
    
        @Override
        public int getItemCount() {
            return 2;
        }
    }
    
  3. MainActivity中(使用视图绑定从xml文件中获取视图)

    public class MainActivity extends AppCompatActivity {
         //Tabs titles
         private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2};
         //Binding object
         private ActivityMainBinding binding;
    
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             //Inflate layout
             binding = ActivityMainBinding.inflate(getLayoutInflater());
             View view = binding.getRoot();
             setContentView(view);
    
             //Get TabLayout View
             TabLayout tabs = binding.tabs;
             //Get the viewPager View
             ViewPager2 viewPager = binding.viewPager;
    
             //Adapter for ViewPager
             PagerAdapter pagerAdapter = new PagerAdapter(this);
             //Set Adapter for ViewPager
             viewPager.setAdapter(pagerAdapter);
    
             //Integrate TabLayout with ViewPager
             //i use it to get tabs titles
             new TabLayoutMediator(tabs, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
                 @Override
                 public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                     //set the title for the tab at position index
                     tab.setText(getResources().getString(TAB_TITLES[position]));
                 }
             }).attach();
         }
    }
    

我使用的这些资源(您可以阅读以了解更多详细信息):

我希望对此有所帮助。

答案 5 :(得分:0)

最简单的方法是使用这一行代码:

tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);

对于选项卡的RTL排序,您应该在寻呼机中执行此操作:

viewPager.setCurrentItem(adapter.getCount());

感谢:arash-hatemi