Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用导航组件时,片段savedInstanceState始终为空_Android_Android Fragments_Android Architecture Components_Android Navigation_Android Bottomnav - Fatal编程技术网

Android 使用导航组件时,片段savedInstanceState始终为空

Android 使用导航组件时,片段savedInstanceState始终为空,android,android-fragments,android-architecture-components,android-navigation,android-bottomnav,Android,Android Fragments,Android Architecture Components,Android Navigation,Android Bottomnav,目前,我正在玩Android导航组件的底部导航栏。在玩的时候,我意识到了两个事实: 始终会重新创建片段(onCreate,onViewCreated,onviewdestromed在用户导航到另一个片段时立即调用) savedInstanceState始终为空(在onCreate、onViewCreated等中) 第一个问题可以通过使用定制的FragmentNavigator解决,如果片段已经存在,它将重用片段 包am.chamich.apps.AdvancedBoottomNavigati

目前,我正在玩Android导航组件的底部导航栏。在玩的时候,我意识到了两个事实:

  • 始终会重新创建片段(
    onCreate
    onViewCreated
    onviewdestromed
    在用户导航到另一个片段时立即调用)
  • savedInstanceState
    始终为空(在
    onCreate
    onViewCreated
    等中)
第一个问题可以通过使用定制的
FragmentNavigator
解决,如果片段已经存在,它将重用片段

包am.chamich.apps.AdvancedBoottomNavigation.navigator
导入android.content.Context
导入android.os.Bundle
导入androidx.navigation.NavDestination
导入androidx.navigation.NavOptions
导入androidx.navigation.Navigator
导入androidx.navigation.fragment.FragmentNavigator
@Navigator.Name(“retain\u state\u fragment”)
类RetainStateFragmentNavigator(
私有val上下文:上下文,
私有val管理器:androidx.fragment.app.FragmentManager,
私人val集装箱ID:Int
):FragmentNavigator(上下文、管理器、容器ID){
覆盖乐趣导航(
目的地:目的地,
args:包?,
导航选项:导航选项?,
navigatorExtras:Navigator.Extras?
):目的地{
val tag=destination.id.toString()
val事务=manager.beginTransaction()
val currentFragment=manager.primaryNavigationFragment
如果(currentFragment!=null){
事务分离(currentFragment)
}
var fragment=manager.findFragmentByTag(标记)
if(片段==null){
val className=destination.className
片段=实例化片段(上下文、管理器、类名、参数)
事务.添加(containerId、片段、标记)
}否则{
事务。附加(片段)
}
transaction.setPrimaryNavigationFragment(片段)
transaction.setReorderingAllowed(true)
commit()事务
返回目的地
}
}
问题: 对于第二个问题,我不知道如何修复它,事实上,我甚至不知道片段是如何恢复其状态的(例如,当您旋转屏幕时),我使用
fragment.setInitialSavedState(savedState)
来保存和恢复片段状态,但这在这种情况下没有帮助

实际上我需要知道的是片段视图是何时重新创建的


这是我的GitHub项目的一个示例,欢迎提供任何帮助。

只有在重新创建活动(例如屏幕旋转)时,片段才会保存其状态,更改片段并不重要。从文件:

在许多情况下,片段可能大部分被删除(例如,当放在后堆栈上时,没有显示UI),但在其所属活动实际需要保存其状态之前,不会保存其状态

保存自定义状态:

将此方法放入片段中:

override fun onSaveInstanceState(outState: Bundle) {
    outState.putString("text", "some value")
    super.onSaveInstanceState(outState)
}
并读取值,例如,在
onViewCreated
中:

val text = savedInstanceState?.getString("text")
重新创建活动(和片段)时,屏幕旋转/电话语言更改或其他配置更改后,您将收到所需的值。

查看此博客,此博客解释如何在活动被销毁时保存活动状态


例如,如果在活动运行时更改手机语言(因此需要加载项目中的不同资源)。另一种非常常见的情况是,当您将手机旋转到一侧时,活动将被重新创建并以横向方式显示。您可以使用此技术存储应用程序的实例值(选择、未保存的文本等)。

您可以在此处检查片段的生命周期@ErginErsoy我知道片段的生命周期,但这无助于解决问题,问题是saveInstanceState始终为空,即使碎片被重新附着,你也要检查这个问题的答案@ErginErsoy是的,我检查过,我甚至试过。根本不起作用:(@ErginErsoy您可以签出我的项目并尝试运行它,当单击日志中的导航项时,您将看到大量日志,
saveinstance
状态始终为空:(