Android 使用ViewPagerIndicator单击选项卡时禁用平滑动画

Android 使用ViewPagerIndicator单击选项卡时禁用平滑动画,android,android-viewpager,viewpagerindicator,Android,Android Viewpager,Viewpagerindicator,我使用ViewPagerIndicator库中的TabPageIndicator和ViewPager来显示6个片段。假设我在第一页,如果我点击第六个标签,我会看到我所有的页面都被滚动。是否可以禁用此动画?也许我可以在ViewPager中禁用它 下面是适配器的代码: public class TabBarFragmentPagerAdapter extends FragmentPagerAdapter implements IconPagerAdapter { private final List

我使用ViewPagerIndicator库中的TabPageIndicator和ViewPager来显示6个片段。假设我在第一页,如果我点击第六个标签,我会看到我所有的页面都被滚动。是否可以禁用此动画?也许我可以在ViewPager中禁用它

下面是适配器的代码:

public class TabBarFragmentPagerAdapter extends FragmentPagerAdapter implements IconPagerAdapter {
private final List<Fragment> items;
private static final String[] TITLES = new String[] { "Home", "Profile", "Explore", "Contacts", "Beacon" };
private static final int[] ICONS = new int[] {
        R.drawable.icon_tabbar_home_bg,
        R.drawable.icon_tabbar_profile_bg,
        R.drawable.icon_tabbar_explore_bg,
        R.drawable.icon_tabbar_contacts_bg,
        R.drawable.icon_tabbar_beacon_bg
};

public TabBarFragmentPagerAdapter(FragmentManager fm, List<Fragment> items) {
    super(fm);
    this.items = items;
}

@Override
public Fragment getItem(int position) {
    return items.get(position);
}

@Override
public int getIconResId(int index) {
    return ICONS[index];
}

@Override
public CharSequence getPageTitle(int position) {
    return TITLES[position];
}

@Override
public int getCount() {
    return items.size();
}
}
公共类TabBarFragmentPagerAdapter扩展FragmentPagerAdapter实现IconPagerAdapter{
私人最终清单项目;
私有静态最终字符串[]TITLES=新字符串[]{“Home”、“Profile”、“Explore”、“Contacts”、“Beacon”};
私有静态最终int[]图标=新int[]{
R.drawable.icon\u tabbar\u home\u bg,
R.drawable.icon\u tabbar\u profile\u bg,
R.drawable.icon\u tabbar\u explore\u bg,
R.drawable.icon\u tabbar\u contacts\u bg,
R.drawable.icon\u tabbar\u beacon\u bg
};
公共选项卡FragmentPageRadapter(FragmentManager格式,列表项){
超级(fm);
这个项目=项目;
}
@凌驾
公共片段getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共整数getIconResId(整数索引){
返回图标[索引];
}
@凌驾
公共字符序列getPageTitle(int位置){
返回标题[职位];
}
@凌驾
public int getCount(){
返回items.size();
}
}

我调查了TabPageIndicator的代码,发现现在还不可能。请参阅mTabClickListener的代码:

private final OnClickListener mTabClickListener = new OnClickListener() {
    public void onClick(View view) {
        TabView tabView = (TabView)view;
        final int oldSelected = mViewPager.getCurrentItem();
        final int newSelected = tabView.getIndex();
        mViewPager.setCurrentItem(newSelected);
        if (oldSelected == newSelected && mTabReselectedListener != null) {
            mTabReselectedListener.onTabReselected(newSelected);
        }
    }
};
为了支持此功能,我们应该向setCurrentItem添加第二个参数。大概是这样的:

mViewPager.setCurrentItem(newSelected, smoothScrollEnabled);

另一个选项是覆盖
CustomViewPager
类子类
ViewPager
中的
setCurrentItem(int i)
,如下所示:

@Override
public void setCurrentItem(int item) {
    super.setCurrentItem(item,false);
}

现在,您可以使用材质库和viewPager2中的TabLayout和这段代码来同步它们,还可以禁用平滑滚动:

TabLayoutMediator(tabLayout, pager, false, false) { tab, position ->
                when(position) {
                    0 -> tab.text = "text 1"
                    1 -> tab.text = "text 2"
                    2 -> tab.text = "text 3"
                }
            }.attach()
设置为false的第二个布尔参数是smoothScroll参数

更多信息和官方文件:

为什么不使用ABS中的选项卡?或者,只有在单击下一个/上一个选项卡时,才需要滑动功能和动画?不,我只想在单击我的TabPageIndicator时禁用平滑scrool。我不想将ABS添加到项目中,因为我有相当具体的设计,实际上我不需要其他ABS功能。我还相信添加ABS会使项目更加复杂(你可以随时编辑TPI代码以满足你的需要)是的,实际上我已经在我的项目中实现了这个功能。我想等我有空的时候,我会准备这个功能的请求