如何在使用带有底部导航组件的片段管理器时更改片段工具栏的标签

How to change label of fragment toolbar while using fragment manager with bottom navigation component

提问人:Ahmed Saad 提问时间:10/30/2023 更新时间:10/31/2023 访问量:27

问:

我有 3 个片段和 1 个活动。, , ,MainActivityCameraFragmentHomeFragmentHistoryFragment

我只想保存所有状态,以便每当用户访问它时,它都不会再次重新创建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"/>

问题是当我打开应用程序时,运行然后它显示,当我单击底部导航的历史项时,它被隐藏显示,但标题栏中的标签是主页而不是历史记录MainActivityhomeFragmenthomeFragmenthistoryFragment

我使用了 Logcat,并且在调用时检测到:在 historyFragment 中,我获取了 homeFragmentidnavController.currentDestination?.id

我希望你能给我这个或任何其他保存片段的方法,没有错误 提前致谢

安卓 kotlin android-fragments android-toolbar android-bottomnav

评论


答:

1赞 Alvaro Ramirez Crisostomo 10/31/2023 #1

好吧,这应该是一个评论,但我不能。 不过,我还是会与您分享,以防您仍然找不到解决方案。

关于您想从片段中存储什么或为什么,我没有太多上下文。 我仍然认为,如果您想在活动处于活动状态时存储片段 [数据或步骤] 的整个状态,我建议使用活动范围的视图模型

private val someViewModel: SomeViewModel by activityViewModels()

这样,要从历史记录片段存储的每个更改都可以存储在视图模型中,然后,如果您转到另一个片段,然后返回到片段,它会获取此数据并将其显示给用户,因此它会重新创建,但使用最新的数据而不是从头开始。

作为查找此委托的其他数据,应添加依赖项:

implementation "androidx.fragment:fragment-ktx:1.6.1"

评论

0赞 Ahmed Saad 10/31/2023
在片段之间快速切换会重新创建 historyFragment,因为它不利于用户体验,但我使用了 ViewModel 来保存数据,谢谢