我得到了 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
时,我得到homeFragment的id 我希望你给我解决方案或任何其他方式来
保存片段没有错误 预先感谢
对于您想要从片段中具体存储什么内容或为什么,我没有太多背景信息。 我仍然会考虑,如果您想在活动处于活动状态时存储片段的整个状态[数据或步骤],我建议使用活动范围的视图模型
private val someViewModel: SomeViewModel by activityViewModels()
这样,您想要从历史片段存储的每个更改都可以存储在视图模型中,然后如果您转到另一个片段然后返回到该片段,它会获取此数据并将其显示给用户,所以它是重新创建,但使用最新数据,而不是从头开始。作为查找此委托的附加数据,您应该添加依赖项:
implementation "androidx.fragment:fragment-ktx:1.6.1"