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

问题描述 投票:0回答:1

我得到了 3 个碎片和 1 个活动。

MainActivity
CameraFragment
HomeFragment
HistoryFragment

我只想保存所有

HistoryFragment
状态,这样每当用户访问它时,它就不会再次重新创建

无论如何,我找到了最常见的解决方案

fragmentManager

这是我所有的代码,

MainActivity.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
 但标题栏中带有标签 
Home 不是历史记录

我使用了Logcat,并且我发现当我在historyFragment中调用:

navController.currentDestination?.id

时,我得到
homeFragmentid

我希望你给我解决方案或任何其他方式来

保存片段没有错误 预先感谢

android kotlin android-fragments android-toolbar android-bottomnav
1个回答
0
投票
嗯,这应该是一个评论,但我不能。 不过,如果您仍然找不到解决方案,我还是与您分享。

对于您想要从片段中具体存储什么内容或为什么,我没有太多背景信息。 我仍然会考虑,如果您想在活动处于活动状态时存储片段的整个状态[数据或步骤],我建议使用活动范围的视图模型

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

作为查找此委托的附加数据,您应该添加依赖项:

implementation "androidx.fragment:fragment-ktx:1.6.1"
    
© www.soinside.com 2019 - 2024. All rights reserved.