单个活动:带有 AppBarLayout 的片段

Posted

技术标签:

【中文标题】单个活动:带有 AppBarLayout 的片段【英文标题】:Single activity: fragment with AppBarLayout 【发布时间】:2021-11-11 17:22:20 【问题描述】:

我有一个带有RecyclerView 的片段。单击一个项目时,我正在导航(使用导航组件)到一个详细信息片段。

在细节片段中,我想实现AppBarLayout。但我已经有一个活动级别的工具栏。

我怎样才能实现这样的目标?您可以在Google design guidelines 上找到视频。不确定他们是否正在开始一项新活动。底部导航也是我的活动的一部分,在使用 AppBarLayout 导航到详细信息片段时应该可见。

【问题讨论】:

【参考方案1】:

在细节片段中,我想实现 AppBarLayout。但我已经有一个活动级别的工具栏。

所以,现在活动有一个工具栏,你想在DetailFragment 中设置另一个工具栏。并且当您使用导航组件时,您可能会将工具栏由navController 管理

好吧,这需要您将活动级别工具栏移动到主片段中;由navHostFragment 主持。

原因:因为从片段级别设置另一个工具栏会复制它,因为活动级别的工具栏始终存在。 Check this answer 。

因此您需要在片段中设置工具栏;通常当您通过导航组件从一个片段移动到另一个片段时,不会发生重复,现在您可以根据需要使用不同的工具栏。

这是一个示意图演示:

活动:

class MainActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    

    fun setupActionBar(toolbar: Toolbar) 
        setSupportActionBar(toolbar)
        val navHostFragment =
            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        val navController = navHostFragment.navController
        val appBarConfiguration = AppBarConfiguration.Builder(
            R.id.fragment, R.id.fragment_b
        ) .build()

        NavigationUI.setupActionBarWithNavController(
            this,
            mNavController,
            navController
        )
    


片段A

class FragmentA : Fragment() 

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        val view = inflater.inflate(R.layout.fragment_a, container, false)

        (requireActivity() as MainActivity).setupActionBar(view.findViewById(R.id.fragment_toolbar))


        return view
    


FragmentB:类似于FragmentA,但有自己的toolBar

class FragmentB : Fragment() 

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        val view = inflater.inflate(R.layout.fragment_b, container, false)

        (requireActivity() as MainActivity).setupActionBar(view.findViewById(R.id.fragment_toolbar))


        return view
    


【讨论】:

这是一个解决方案,但在我看来不是一个好的解决方案。每次导航到不同的片段时,您都必须设置工具栏。即使我在整个应用程序中只需要一个不同的工具栏。 @Erkan 在navGraph 中还有另一个选项可以为详细信息片段创建另一个活动,您可以为该活动setSupportActionBar。 navigation components can support multiple activities 谢谢,我试试。这与单一活动方法相反,但目前这对我来说是最好的解决方案。安也找到了另一种解决方案。在活动级别设置 AppBarLayout 并启用或禁用 AppBarLayout 的滚动行为。

以上是关于单个活动:带有 AppBarLayout 的片段的主要内容,如果未能解决你的问题,请参考以下文章

带有工具栏的 AppBarLayout 没有阴影/高度

片段的布局被活动的工具栏/标签布局覆盖

如何在 FAB 按钮单击时将数据从多个片段发送到单个活动

如何在ViewPager中渲染单个片段?

AppBarLayout 与 FrameLayout 容器作为滚动内容不起作用

在单个活动中动态实现多个片段