Есть ли способ перелистывать от одного фрагмента к другому с помощью навигационных графиков?

Итак, у меня есть навигационный график с двумя фрагментами (FragA, FragB), и я хочу иметь возможность переходить от одного к другому, проводя пальцем влево или вправо. У меня есть действие, которое соединяет FragA с FragB, и я использовал его для перехода от FragA к FragB нажатием кнопки. Однако я хочу иметь возможность провести пальцем влево по FragA, чтобы добраться до FragB, и наоборот, чтобы вернуться.

изменить: я пытаюсь использовать навигацию вместо ViewPager, потому что FragA также подключен к другому фрагменту через граф навигации. Прямо сейчас я пытаюсь объединить компонент навигации и окно просмотра, но мне нужно решение только с компонентом навигации.


person Rahul K.    schedule 28.03.2021    source источник
comment
У навигации нет пользовательского интерфейса. В результате он не обрабатывает жесты смахивания. Разработчики компонента навигации задокументировали два решения для этого: ViewPager (developer.android. com / guide / navigation / navigation-swipe-view) и ViewPager2 (developer.android.com/guide/navigation/navigation-swipe-view-2). Вы можете попробовать выполнить собственное обнаружение жестов (например, через GestureDetector) и просто анимировать переходы между фрагментами.   -  person CommonsWare    schedule 29.03.2021


Ответы (1)


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

  • Добавлен androidx.viewpager2.widgit.ViewPager2 в мой activity_main.xml
  • Добавлен java-класс PagerAdapter, расширяющий FragmentStateAdapter
    • I used the default constructor that took FragmentManager and Lifecycle as arguments
    • Implemented methods
      • createFragment returns FragA for position = 0 and FragB for position = 2
      • getcount returns 2 (cuz I only have 2 fragments)

В MainActivity onCreate

  • Создал последний экземпляр ViewPager2 и установил для него ViewPager2 в моем activity_main.xml
  • Создан новый экземпляр PagerAdapter, передающий getSupportFragmentManager (), getLifecycle () в качестве аргументов
  • установите адаптер viewpager на pageradapter

Это дало мне именно то, что я хотел, но не то, что я думал, что мне это нужно.

Вы можете остановиться здесь, но сейчас возникает одна небольшая проблема. Если вы нажмете кнопку «Назад», ожидая отмены действия навигации в навигационном графе, приложение вместо этого выполнит действие, ожидаемое при нажатии кнопки «Назад» на уровне основной активности.

Просто скопируйте это во фрагменты навигационного графика, где вы хотите, чтобы нажатие назад отменяло действие навигации, которое привело вас к

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    OnBackPressedCallback callback = new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            popNavBackStack();
        }
    };
    requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}

public void popNavBackStack(){
    NavController journalNavHost = NavHostFragment.findNavController(this);
    journalNavHost.popBackStack();
}
person Rahul K.    schedule 29.03.2021
comment
Новая отдельная, возможно, работающая проблема, которая возникает, заключается в том, что теперь, когда я нажимаю назад, я хочу, чтобы мой компонент навигации в ViewPager2 реагировал на него, если ViewPager2 показывает позицию 0. Но кажется, что ViewPager перехватывает его и минимизирует приложение. - person Rahul K.; 29.03.2021