在细节片段中,我想实现 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
}
}