Как отключить смахивание в ViewPager2?
Возможно ли включить-отключить смахивание в новом андроиде viewpager2
составная часть?
7 ответов
Теперь есть возможность включить-отключить смахивание viewpager2
с помощью Version 1.0.0-alpha02
использование implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'
Новые возможности
- Возможность отключить пользовательский ввод (
setUserInputEnabled
,isUserInputEnabled
)
Изменения API
ViewPager2
финал класса
Исправление ошибок
FragmentStateAdapter
исправления стабильности
SAMPLE CODE, чтобы отключить считывание в viewpager2
myViewPager2.setUserInputEnabled(false);
ОБРАЗЕЦ КОДА для включения считывания в viewpager2
myViewPager2.setUserInputEnabled(true);
Если вы используете Android Data Binding, вы можете просто отключить его в XML-файле макета.
app:userInputEnabled="@{false}"
Под капотом ViewPager2
работает с RecyclerView
для надувания фрагментов, но RecyclerView
скрыт, поэтому они делают его более идиотским доказательством.
val rv : RecyclerView = viewPager.getChildAt(0) as RecyclerView
rv.layoutManager = NonScrollingLayoutManager( rv.context, rv.layoutManager as LinearLayoutManager)
Хакерский путь состоит в том, чтобы получить ребенка в нулевой позиции, которая является RecyclerView
и отключите прокрутку в менеджере раскладки, обернув менеджер раскладки:
inner class NonScrollingLayoutManager(context: Context, val layoutManager: LinearLayoutManager) :
LinearLayoutManager(context, layoutManager.orientation, layoutManager.reverseLayout) {
override fun canScrollVertically(): Boolean = layoutManager.orientation == HORIZONTAL
override fun canScrollHorizontally(): Boolean = layoutManager.orientation == VERTICAL
}
Пожалуйста, имейте в виду, что если API изменяет менеджер макета, используемый для RecyclerView, то есть они удаляются от LinearLayoutManager
это не сработает, и потребуется переопределить некоторые методы и обеспечить вызов супер-методов.
Второй подход - это подкласс ViewPager2
который ViewGroup
и затем сделайте магию в перехвате сенсорных событий, прежде чем они будут отправлены дочерним представлениям (как вы могли бы догадаться, RecyclerView
) и будьте осторожны, чтобы не предотвратить щелчки.
в котлине просто используйтеviewPager2.isUserInputEnabled = false
просто используйтеmyViewPager2.setUserInputEnabled(false); // in java myViewPager2.isUserInputEnabled = false // in kotlin
отключить ручную прокрутку пользователем при пролистывании
Да, это возможно.
mViewPager2.setUserInputEnabled(false);
//отключаем свайп
mViewPager2.setUserInputEnabled(true);
//включает свайп
Мы можем отключать и включать на основе вкладок, как показано в приведенном ниже коде.
ViewPager2 mViewPager2 = findViewById(R.id.view_pager);
mViewPager2.setOffscreenPageLimit(adapter.getItemCount() - 1);
mViewPager2.setAdapter(adapter);
TabLayout tabLayout = findViewById(R.id.sliding_tabs);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//do stuff here
if(tab.getPosition() == 0){
**//ToDisable**
mViewPager2.setUserInputEnabled(false);
}else{
**//ToEnable**
mViewPager2.setUserInputEnabled(true);
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});