gpt4 book ai didi

android - 使用replace()后如何保存 fragment 的实例状态?

转载 作者:行者123 更新时间:2023-11-29 02:21:01 25 4
gpt4 key购买 nike

我的 Activity 有 3 个子 fragment - 一次只显示 1 个。我正在使用 BottomNavigationView 在子 fragment 之间切换。当通过 supportFragmentManager.beginTransaction().replace() 创建 Activity 时,显示的初始子 fragment GameFragment() 会膨胀,这会替换我的 XML 中的 fragment 容器。

首先,让我向您展示我进入 Activity 的完整生命周期,在 replace() 上切换 fragment ,然后在 replace() 上切换回初始 fragment .这些日志语句仅与 Activity 和 fragment A( fragment B 和 C 未显示)相关。

onCreate (Activity)
onAttach (Fragment A)
onCreate (Fragment A)
onCreateView (Fragment A)
onActivityCreated (Fragment A)

.replace() fragment A 与 fragment B

onPause (Fragment A)
onStop (Fragment A)

.replace() fragment B 与 fragment A

onAttach (Fragment A)
onCreate (Fragment A)
onCreateView (Fragment A)
onActivityCreated (Fragment A)

为了在使用 replace() 切换 fragment 时保留我的 fragment 状态,我尝试了以下方法,但都失败了。

  1. onDestroyView() 中更改 fragment 中的成员变量的值,然后在 onActivityCreated()

    中访问它
  2. onDestroyView() 中添加到 getArguments() 并在 onActivityCreated() 中访问。

    class GameFragment : Fragment(), View.OnClickListener {

    var truthisvisible = "string"

    override fun onDestroyView() {
    super.onDestroyView()
    truthisvisible = "stringafter"
    arguments?.putString("success", "success")

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_game, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
    Log.d("truthisvisible", truthisvisible) // prints "string"
    if (savedInstanceState != null){
    Log.d("LifecycleChange", "onActivityCreated savedInstanceState") // savedInstanceState is always null
    }
    super.onActivityCreated(savedInstanceState)
    Log.d("truthisvisible", truthisvisible) // prints "string"
    val print = arguments?.getString("success", "failure")
    Log.d("bool", "..." + print) // prints "...null"

我还尝试在 onPause() 中更改变量 truthisvisible,并尝试在 onCreateView() 中接收变量但是变量永远不会更改为 stringaftergetArguments() 也是如此 - 参数不变。

此外,所有这些方法中的savedInstanceState 都是null。虽然我预计这是因为 onSaveInstanceState() 在替换 fragment 时永远不会被触发。

我完全陷入了死胡同。调用 replace() 时如何更改或保存 fragment 中的变量?如果您好奇的话,这是我的家长 Activity :

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;

关于android - 使用replace()后如何保存 fragment 的实例状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55610266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com