android 更改viewPager扫动方向

thigvfpy  于 2022-11-27  发布在  Android
关注(0)|答案(6)|浏览(222)

我正在使用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时,它会显示下一页。
这可能很难理解,但在这里。向右滑动显示下一页

而我需要向右滑动才能显示上一页

bqujaahr

bqujaahr1#

更改Viewpager的滑动方向是一种非常简单的技术。
有两个简单步骤必须遵循你,

**1.**更改“视图”页导航的循环,

viewpager.setRotationY(180);

**2.**然后再次更改适配器中每个项目视图的方向,

itemView.setRotationY(180);

这是100%为我工作。

hgqdbh6s

hgqdbh6s2#

一个月前我也遇到过同样的问题,但我想我找到了一个很好的解决方案。
1.在xml中将TabLayout方向更改为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" />

1.为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();
        }
    }

1.将适配器设置为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);
    }
2o7dmzc5

2o7dmzc53#

我知道这是晚了,但这是一个聪明的问题。正如@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()中使用此方法,如下所示:请注意,您应该使用自己max索引:

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

我试着尽我所能地描述。希望这对我有帮助:)

nhaq1z21

nhaq1z214#

如果您使用的是带有片段的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" />

我希望这能帮助到一些人。

pgvzfuti

pgvzfuti5#

您可以使用ViewPager2,它支持从右到左的方向。使之成为可能:
1.在应用清单中添加android:supportsRtl ="true"
1.将viewpager2的父视图组布局方向设为ltr(android:layoutDirection ="ltr")
1.现在设置viewpager2的布局方向ltr(android:layoutDirection ="rtl")
1.同时将适配器的布局设置为layoutDirection ltr(android:layoutDirection ="ltr")

dzjeubhm

dzjeubhm6#

因此,我发现对ViewPager(1)来说,最简单的方法就是反转项目数组,然后在显示之前将页面调度器的当前项目设置在[array size]位置。

相关问题