WedX - журнал о программировании и компьютерных науках

Как запретить viewpager2 переворачивать страницу, когда выбрана вкладка

У меня есть viewpager2, привязанный к tablayout с множеством разных фрагментов, содержащих текстовые представления, я не хочу, чтобы пользователь выбирал другую вкладку, если он не завершил некоторые из текстовых представлений для каждого фрагмента. Поэтому, когда пользователь выбирает другую вкладку, я показываю сообщение с просьбой завершить текущие данные фрагмента. Я пытался выбрать старую вкладку, когда пользователь выбирает другую вкладку в методе onTabUnselected для TabSelectedListener, но безуспешно. Вот код, пожалуйста, посмотрите комментарий TODO, где я хотел бы предотвратить изменение фрагмента.

viewPager = view.findViewById(R.id.mypager)

TabLayoutMediator(tabLayout, viewPager, true, false,
    TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab, position: Int ->
        tab.text = titles[position]
    }).attach()

tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
    override fun onTabSelected(tab: TabLayout.Tab?) {

    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {
        val currFragment= fragmentSet[tab!!.position]
        if (!currFragment.validateFields()) {
            //TODO: don't change tab, remain in this tab something like tab.aborselectedtTransition
        }
    }

    override fun onTabReselected(tab: TabLayout.Tab?) {
    }

})

Кто-нибудь может мне помочь?


  • Может быть, что-то очевидное, например tab.view.clickable = false внутри стратегии для правой вкладки + создать новый / повторно подключить TabLayoutMediator, когда это необходимо? 27.01.2021
  • попытался отсоединить TabLayoutMediator, но я не понимаю, как это сделать 27.01.2021
  • Добавьте мой код туда, где у вас tab.text = titles[position] на основе текущей вкладки и результата проверки ... И снова подключите 27.01.2021
  • к сожалению, не работает, он теряет выбор вкладок, и вы больше не можете изменить вкладку, поэтому вы можете повторно отправить свои данные фрагмента ,,, 27.01.2021

Ответы:


1

Я решил сам, вместо того, чтобы использовать onTabUnselected, лучше использовать прослушиватель для события onTouch, таким образом вы можете запретить просмотрщику менять страницу, просто возвращая true из onTouchListener. Пожалуйста, проголосуйте за меня, если вам это нравится.

viewPager = view.findViewById(R.id.mypager)

TabLayoutMediator(tabLayout, viewPager, true, false,
    TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab, position: Int ->
                tab.text = titles[position]
                tab.view.setOnTouchListener { v, event -> onTabLayoutTouch(v,event) }
 }).attach()

private fun onTabLayoutTouch(view:View, event:MotionEvent):Boolean {
    val viewTab = view as TabLayout.TabView
    val tabIndex = viewTab.tab?.position?:-1

    var validationOk = true

    if (event.action == MotionEvent.ACTION_DOWN ) {

        val currFragment = fragmentSet[viewPager.currentItem]

        if (viewPager.currentItem!=tabIndex) {
            val validation = currFragment.validateFields()
            if (!validation.validationResult && event.action==MotionEvent.ACTION_DOWN) {
                showMessage(context, "Compila i dati obbligatori.\n ${validation.message}")
                validationOk = false
            }
        }
    }
    return !validationOk
}
28.01.2021
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]