【问题标题】:Binding different menu with different fragment with Navigation component用导航组件绑定不同的菜单和不同的片段
【发布时间】:2018-10-02 21:14:28
【问题描述】:

我有一个使用 BottomNavigationBar 的活动。

我默认在工具栏中间显示app logo。

现在,我必须在选择一个底部显示项目时在整个工具栏上显示SearchBar。此外,我想在选择任何其他 bottomNavigation 项目时恢复到默认工具栏视图(中间带有徽标的)。

我如何使用导航组件做到这一点?

如果我必须使用 ViewSwitcher 或 ActionMode,则必须放弃导航组件的整个想法,因为我可以自己处理一些片段事务。

在这里帮帮我。

【问题讨论】:

  • 所以你的 Activity 中有一个 Toolbar,但如果你在一个特定的底部导航项上,它就完全不同了?
  • 假设我有 2 个带有不同工具栏的活动,但我想使用单个活动拱门,但工具栏应该像以前一样更改。
  • @ianhanniballake 如果这应该由应用程序开发人员处理,或者我要问的是糟糕的设计,请告诉我,我会做出相应的更改。感谢您的回复。

标签: android kotlin android-toolbar android-jetpack android-architecture-navigation


【解决方案1】:

有两种方法可以做到这一点:

1) 让每个 Fragment 实现自己的工具栏

这种方法在每个 Fragment 负责什么方面为您提供了最大的灵活性,但如果您有许多不同类型的 Fragment 或需要每个 Fragment 不同的滚动行为,则更适合。

2) 使用 OnNavigatedListener 更改 Activity 的工具栏

NavController 允许您附加任意数量的OnNavigatedListener 实例,当当前目标/项目更改时,它会为您提供回调。

这允许您在 Activity 中编写代码,例如:

navController.addOnNavigatedListener { navController, destination ->
  if (destination.id == R.id.search_destination) {
    // Update your Toolbar to be a SearchBar
  } else {
    // Reset it back to a standard Toolbar
  }
}

【讨论】:

  • 感谢您的回复。我应用了第一种方法。我的片段工具栏之一是 CollapsingToolbar,当显示该片段时,它导致 72px 的 paddingTop 到 ConstraintLayout。你能说出为什么会这样吗?我在该特定片段的 onDestroyView() 中通过将其设置为零来处理它。
  • <ConstraintLayout><FrameLayout><fragment-content including collapsingToolbar/></FrameLayout></ConstraintLayout>。这里 FrameLayout 具有父级的 toptop 约束,但在 ConstraintLayout 中看到了 72 px 的填充(手机的密度为 428 dpi)。在使用 CollapsingToolbar 添加片段之前,它是零。即使在替换片段后它仍然存在。
  • 如果您在布局中的任何位置使用fitsSystemWindows,请确保在每个片段的onViewCreated 中调用ViewCompat.requestApplyInsets 以确保它们具有正确的插图
猜你喜欢
  • 2020-11-05
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
相关资源
最近更新 更多