Отключение пролистывания в TabLayout: несколько методов и примеры кода

TabLayout – это широко используемый компонент при разработке приложений для Android, который обеспечивает удобный способ реализации навигации с вкладками. По умолчанию TabLayout позволяет пользователям переключаться между вкладками. Однако могут возникнуть ситуации, когда вы захотите отключить эту функцию пролистывания. В этой статье мы рассмотрим несколько способов отключения пролистывания в TabLayout, а также приведем примеры кода.

Метод 1: использование пользовательского ViewPager
Один из подходов к отключению пролистывания в TabLayout — создание собственного ViewPager, который переопределяет поведение пролистывания по умолчанию. Вот пример:

public class NonSwipeableViewPager extends ViewPager {
    private boolean swipeEnabled;
    public NonSwipeableViewPager(Context context) {
        super(context);
        this.swipeEnabled = true;
    }
    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.swipeEnabled = true;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.swipeEnabled && super.onTouchEvent(event);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.swipeEnabled && super.onInterceptTouchEvent(event);
    }
    public void setSwipeEnabled(boolean enabled) {
        this.swipeEnabled = enabled;
    }
}

Чтобы использовать этот пользовательский ViewPager в своем TabLayout, замените ViewPager по умолчанию на NonSwipeableViewPagerв файле макета XML:

<com.example.app.NonSwipeableViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Метод 2: программное отключение пролистывания
Другой способ отключить пролистывание в TabLayout — использовать метод addOnPageChangeListenerViewPager и переопределить обратный вызов onPageScrollStateChanged. Вот пример:

ViewPager viewPager = findViewById(R.id.viewPager);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // Not needed for disabling swipe
    }
    @Override
    public void onPageSelected(int position) {
        // Not needed for disabling swipe
    }
    @Override
    public void onPageScrollStateChanged(int state) {
        // Disable swipe when the state is not idle
        viewPager.setSwipeEnabled(state == ViewPager.SCROLL_STATE_IDLE);
    }
});

Этот метод позволяет программно включать или отключать пролистывание в зависимости от состояния прокрутки ViewPager.

Метод 3: использование TabLayoutMediator
Если вы используете TabLayoutMediator для подключения TabLayout к ViewPager, вы можете отключить пролистывание, установив для параметра autoRefreshзначение falseпри создании экземпляра TabLayoutMediator. Вот пример:

TabLayout tabLayout = findViewById(R.id.tabLayout);
ViewPager viewPager = findViewById(R.id.viewPager);
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
    // Tab binding logic
}).setAutoRefresh(false).attach();

Установив для autoRefreshзначение false, вы предотвращаете автоматическое обновление TabLayout при изменении содержимого ViewPager, фактически отключая пролистывание.

В этой статье мы рассмотрели несколько способов отключения пролистывания в TabLayout. Независимо от того, предпочитаете ли вы использовать собственный ViewPager, обрабатывать изменения состояния прокрутки или использовать TabLayoutMediator, у вас есть несколько вариантов достижения желаемого поведения. Отключив пролистывание, вы можете настроить навигацию с вкладками вашего приложения в соответствии с конкретными требованиями.