提问人:Ahmed Saad 提问时间:10/30/2023 更新时间:10/31/2023 访问量:27
如何在使用带有底部导航组件的片段管理器时更改片段工具栏的标签
How to change label of fragment toolbar while using fragment manager with bottom navigation component
问:
我有 3 个片段和 1 个活动。, , ,MainActivity
CameraFragment
HomeFragment
HistoryFragment
我只想保存所有状态,以便每当用户访问它时,它都不会再次重新创建。HistoryFragment
无论如何,我找到了最常见的解决方案fragmentManager
这是我所有的代码,
MainActivity.kt(主活动.kt)
class MainActivity : AppCompatActivity() {
private val historyFragment = HistoryFragment()
private val homeFragment = HomeFragment()
private val cameraFragment = CameraFragment()
private val fragmentManager = supportFragmentManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val ft = fragmentManager.beginTransaction()
ft.add(R.id.fragmentContainerView, historyFragment, Constants.TAG_HISTORY)
.hide(historyFragment)
.add(R.id.fragmentContainerView, homeFragment, Constants.TAG_HOME)
cameraViewModel.activeFragment = if (hasPermission()) {
//camera
ft.add(R.id.fragmentContainerView, cameraFragment, Constants.TAG_CAMERA)
ft.hide(homeFragment)
cameraFragment
} else {
//home
homeFragment
}
ft.commit()
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment
val navController = navHostFragment.findNavController()
binding.bottomNav.setupWithNavController(navController)
binding.bottomNav.setOnItemSelectedListener { item ->
when (item.itemId) {
R.id.historyFragment -> {
when (cameraViewModel.activeFragment) {
is HomeFragment -> fragmentManager.beginTransaction().hide(cameraViewModel.activeFragment).show(historyFragment).commit()
}
cameraViewModel.activeFragment = historyFragment
item.isChecked = true
true
}
}
}
历史片段.kt
class HistoryFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentHistoryBinding.inflate(inflater, container, false)
// tool bar
(activity as AppCompatActivity).setSupportActionBar(binding.toolBarHistory)
val appBarConfiguration = AppBarConfiguration(
setOf(R.id.historyFragment, R.id.homeFragment, R.id.cameraFragment)
)
NavigationUI.setupActionBarWithNavController(requireActivity() as AppCompatActivity, findNavController(), appBarConfiguration)
return binding.root
}
}
fragment_history.xml中的工具栏
<androidx.appcompat.widget.Toolbar
android:id="@+id/tool_bar_history"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"/>
问题是当我打开应用程序时,运行然后它显示,当我单击底部导航中的历史项时,它被隐藏并显示,但标题栏中的标签是主页而不是历史记录MainActivity
homeFragment
homeFragment
historyFragment
我使用了 Logcat,并且在调用时检测到:在 historyFragment 中,我获取了 homeFragment 的 idnavController.currentDestination?.id
我希望你能给我这个或任何其他保存片段的方法,没有错误 提前致谢
答:
好吧,这应该是一个评论,但我不能。 不过,我还是会与您分享,以防您仍然找不到解决方案。
关于您想从片段中存储什么或为什么,我没有太多上下文。 我仍然认为,如果您想在活动处于活动状态时存储片段 [数据或步骤] 的整个状态,我建议使用活动范围的视图模型
private val someViewModel: SomeViewModel by activityViewModels()
这样,要从历史记录片段存储的每个更改都可以存储在视图模型中,然后,如果您转到另一个片段,然后返回到片段,它会获取此数据并将其显示给用户,因此它会重新创建,但使用最新的数据而不是从头开始。
作为查找此委托的其他数据,应添加依赖项:
implementation "androidx.fragment:fragment-ktx:1.6.1"
评论