【问题标题】:how to save current state of fragment如何保存片段的当前状态
【发布时间】:2020-01-21 20:02:53
【问题描述】:

在我的 MainActivity 中,我有一个底部菜单和一个 FrameLayout。 每个底部使用以下代码加载特定片段:

bottomNavigation.setOnClickMenuListener {
        when (it.id) {

            1 -> supportFragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .replace(R.id.frame, ProfileFragment())
                .commit()

            2 -> supportFragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .replace(R.id.frame, MyCalendarFragment())
                .commit()


            3 -> supportFragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .replace(R.id.frame, ScoreFragment())
                .commit()

        }


    }

问题是在移动到其他片段之后,旧的片段状态将被消除, 我如何保存当前片段的状态并在我回到这个片段时加载它。

【问题讨论】:

  • 你每次都在创建新的片段,你可以用你的创建数组,比如.replace(R.id.frame, array[it.id - 1]),其中数组是array = listOf(ProfileFragment(), ...)
  • 你应该把你想要的参数放在一个包中。在您的片段中放置一个静态方法以创建实例,以从包中检索参数。不要只是创建新实例。有更好的方法来实现这一点。 android现在支持按钮导航,不用写代码了How to add a Bottom Navigation Bar in Android
  • 我尝试使用数组,但我没有工作@AlexandrKolesnik

标签: android-fragments kotlin


【解决方案1】:

我不太确定这是否可行,但不能发表评论,因为我的代表不够高。您可以懒惰地创建片段并持有参考:

private val profileFragment: ProfileFragment by lazy {
    ProfileFragment()
}

因为此时您每次替换内容时都会创建一个新实例。 这意味着您的替换将如下所示:

supportFragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .replace(R.id.frame, profileFragment)
                .commit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多