我使用TabLayout和viewPager,并选择向左或向右滑动viewPager,以便在页面之间导航。
我的问题是,我的应用程序是基于RTL的(从右到左),滑动方向是相反的。
我试图将滑动方向从默认版更改为反转版。 我一直在网上搜索很多,但却找不到办法。
我正在使用android.support.v4.view.ViewPager;
这就是我用viewPager初始化我的TabLayout的方法:
// View Page Adapter
final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
//View Page Adapter Configuration
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setOffscreenPageLimit(3);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
摘要:目前,当我向右滑动viewPager时,它会显示下一页。 在RTL中,当您向右滑动viewPager时,它会显示下一页。
可能很难理解,但现在就是这样。 向右滑动即可显示下一页
虽然我需要向右滑动以显示上一页。
答案 0 :(得分:18)
更改Viewpager的滑动方向是非常简单的技术。
有两个简单的步骤必须跟着你,
1。更改View寻呼机的旋转,
viewpager.setRotationY(180);
2. 然后再次更改作为viewpager子项的片段容器的方向,
recyclerView.setRotationY(180);
注意:在我的情况下,我使用了recyclerview作为视图寻呼机的子项。
这是100%为我工作。
答案 1 :(得分:9)
我在一个月前遇到了同样的问题,但我认为我找到了一个很好的解决方案。 1)将您的TabLayout方向更改为xml中的ltr:
<android.support.design.widget.TabLayout
android:id="@+id/tl_activity_main"
android:layout_below="@id/toolbar_activity_main"
android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/DisionTabLayout" />
2)为ViewPager创建自定义适配器并覆盖方法getItem(int position)和getPageTitle(int position):
@Override
public Fragment getItem(int position) {
if (mIsRtlOrientation && mTabs != null && mTabs.length > 0) {
return mTabs[mTabs.length - position - 1].getFragment();
} else {
return mTabs[position].getFragment();
}
}
@Override
public int getCount() {
return mTabs.length;
}
@Override
public CharSequence getPageTitle(int position) {
if (mIsRtlOrientation && mTabs != null && mTabs.length > 0) {
return mTabs[mTabs.length - position - 1].getTitle();
} else {
return mTabs[position].getTitle();
}
}
3)将适配器设置为ViewPager,然后将此ViewPager应用于TabLayout。
private void setAdapters() {
// initialize adapter
mTabsAdapter = new TabsAdapter(getSupportFragmentManager(), mTabs, true);
// set adapter to ViewPager
vp.setAdapter(mTabsAdapter);
// set ViewPager to TabLayout
tl.setupWithViewPager(vp);
// if RTL orientation, go to last item
vp.setCurrentItem(vp.getAdapter().getCount() - 1, false);
}
4)我创建了一篇博文,其中包含更多详细信息和完整代码 - here
答案 2 :(得分:0)
如果将viewpager2与片段一起使用。您可以使用。
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="0dp"
android:layout_height="0dp"
**android:orientation="vertical"**
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
我希望这对某人有帮助。
答案 3 :(得分:0)
你不能使用ViewPager2,它支持从右到左的方向。使其成为可能:
答案 4 :(得分:-1)
我知道它已经很晚了,但这是一个聪明的问题。正如@CommonsWare所说,它是在页面适配器中反转getItem()方法中项目顺序的问题。但这并不值得。当您在getitem()方法中反转顺序时,您也不应该反转getPageTitle()方法中的顺序。像这样的东西:
public static class AppSectionsPagerAdapter extends FragmentStatePagerAdapter {
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new page1();
case 1:
return new page2();
case 2:
return new page3();
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "page 3 title";
case 1:
return "page 2 title";
case 2:
return "page 1 title";
}
}
@Override
public int getCount() {
return 3;
}
}
现在是棘手的部分。你应该使用这个简单的方法,它使用最大索引和当前索引转换基于零的索引顺序。
public int calculateReverse(int maxIndex,int currentIndex){
return maxIndex-currentIndex;
}
比你应该在onTabSelected()中使用这个方法:请注意你应该使用自己的最大索引:
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
mViewPager.setCurrentItem(calculateReverse(2,tab.getPosition()));
}
第二部分是在页面适配器上更改页面侦听器。再一次,您应该使用自己的最大索引号:
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(calculateReverse(2,position)); // reversing the tab selection
}
});
我试着像我一样描述。希望这会有所帮助:)