Android 使用replace()后如何保存片段的实例状态?
我的活动有3个子片段-一次只显示1个。我正在使用BottomNavigationView在子片段之间切换。当通过Android 使用replace()后如何保存片段的实例状态?,android,android-fragments,kotlin,Android,Android Fragments,Kotlin,我的活动有3个子片段-一次只显示1个。我正在使用BottomNavigationView在子片段之间切换。当通过supportFragmentManager.beginTransaction().replace()创建活动时,显示的初始子片段GameFragment()会膨胀,它将替换my XML中的片段容器 首先,让我向您展示我进入活动的整个生命周期,在replace()上切换片段,然后在replace()上切换回初始片段。这些日志语句仅与活动和片段A相关(未显示片段B和C) .replace
supportFragmentManager.beginTransaction().replace()
创建活动时,显示的初始子片段GameFragment()会膨胀,它将替换my XML中的片段容器
首先,让我向您展示我进入活动的整个生命周期,在replace()
上切换片段,然后在replace()
上切换回初始片段。这些日志语句仅与活动和片段A相关(未显示片段B和C)
.replace()
将片段A替换为片段B
onPause (Fragment A)
onStop (Fragment A)
.replace()
将片段B替换为片段A
onAttach (Fragment A)
onCreate (Fragment A)
onCreateView (Fragment A)
onActivityCreated (Fragment A)
为了在使用replace()
切换片段时保留片段状态,我尝试了以下方法,但都失败了
onDestroyView()
中更改片段中成员变量的值,然后在onActivityCreated()中访问它
onDestroyView()
中的getArguments()
,并在onActivityCreated()
中访问
onPause()
中更改变量truthisvisible
,并尝试在onCreateView()
中接收变量,但变量从未更改为stringafter
。getArguments()
也是如此-参数不会改变
此外,所有这些方法中的savedInstanceState
都是null
。虽然我希望在替换片段时不会触发onSaveInstanceState()
我在这里完全走不通了。调用replace()
时,如何更改或保存片段中的变量?如果你好奇,下面是我的家长活动:
var initialFragmentLoad = false
class TruthOrDare : FragmentActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
override fun onNavigationItemSelected(item: MenuItem): Boolean {
if (!initialFragmentLoad){
return true
}
val selectedFragment = when (item.itemId){
R.id.action_leaderboards -> LeaderboardsFragment()
R.id.action_options -> OptionsFragment()
else -> GameFragment()
}
Log.d("ChosenFragment", selectedFragment.toString())
val transaction = supportFragmentManager.beginTransaction().replace(R.id.fragment_layout, selectedFragment)
transaction.addToBackStack(null)
transaction.commit()
return true
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_truth_or_dare)
bottomNav_truthordare.setOnNavigationItemSelectedListener(this)
bottomNav_truthordare.selectedItemId = R.id.action_game
initialFragmentLoad = true
if (savedInstanceState != null) {
return
}
val firstFragment = GameFragment()
firstFragment.arguments = intent.extras
supportFragmentManager.beginTransaction().replace(R.id.fragment_layout, firstFragment).commit();
}
}
我也想知道为什么我不能用上面的方法改变变量 您可以使用处理程序类
public static class GameHandler {
public static string truthisvisible;
}
然后打电话
Gamehandler.truthisvisible = "stringafter";
val previousValue = Gamehandler.truthisvisible;
您可以在
onCreateView()
中尝试阻止片段重新膨胀其视图,如下所示
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
parent.removeView(view);
} else {
//here you put your current code from `onCreateView()`
}
view
是否参考这里的getView()
?我现在已经在代码中添加了onCreateView-我不确定您的代码是否适合我的函数:在您的代码中View View=inflater.inflate()…
,然后返回视图
;
Gamehandler.truthisvisible = "stringafter";
val previousValue = Gamehandler.truthisvisible;
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
parent.removeView(view);
} else {
//here you put your current code from `onCreateView()`
}