【问题标题】:Is there a way to swipe from one fragment to another using navigation graphs?有没有办法使用导航图从一个片段滑动到另一个片段?
【发布时间】:2021-03-28 21:16:14
【问题描述】:

所以我有一个包含 2 个片段(FragA、FragB)的导航图,我希望能够通过向左或向右滑动来从一个片段移动到另一个片段。我有一个将 FragA 连接到 FragB 的操作,我使用它通过单击按钮从 FragA 淡入到 FragB。但是,我希望能够在 FragA 上向左滑动以到达 FragB 并反向返回。

编辑:我正在尝试使用 Navigation 而不是 ViewPager,因为 FragA 还通过导航图连接到另一个片段。现在我正在尝试将导航组件和 viewpager 结合起来,但我想要一个只有导航组件的解决方案。

【问题讨论】:

标签: android android-fragments android-viewpager android-architecture-navigation


【解决方案1】:

显然,在导航旁边使用 ViewPager 并没有那么复杂。以下是我的做法。

  • 在我的 activity_main.xml 中添加了一个 androidx.viewpager2.widgit.ViewPager2
  • 添加了一个 java 类 PagerAdapter 扩展了 FragmentStateAdapter
    • 我使用了将 FragmentManager 和 Lifecycle 作为参数的默认构造函数
    • 实现的方法
      • createFragment 返回位置 = 0 的 FragA 和位置 = 2 的 FragB
      • getcount 返回 2(因为我只有 2 个片段)

在 MainActivity onCreate

  • 创建了 ViewPager2 的最终实例并将其设置为我的 activity_main.xml 中的 ViewPager2
  • 创建了一个新的 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();
}

【讨论】:

  • 出现的新的单独可能可行的问题是,现在当我按下返回时,如果 ViewPager2 显示位置 0,我希望 ViewPager2 中的导航组件对其做出反应。但似乎 ViewPager 正在拦截它并最小化应用程序。
猜你喜欢
  • 2021-05-02
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多