【问题标题】:Move between fragments without recreation- Kotlin在没有娱乐的片段之间移动 - Kotlin
【发布时间】:2019-10-05 19:04:38
【问题描述】:

我试图在两个 fragments 之间移动而不重新创建它们,因此前一个片段中的数据不会消失。

我试图在互联网上寻找答案并尝试了几个小时但没有成功。我查看了这些链接:

show()hide() 之后,我也尝试了AddToBackStack(),但没有成功

class MainActivity : AppCompatActivity(){

    private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        @Override
        when (item.itemId) {
            R.id.navigation_home -> {
                //replaceFragment(SignInFragment())
                supportFragmentManager.beginTransaction().hide(AllEventsFragment()).commit()
                supportFragmentManager.beginTransaction().show(SignInFragment()).commit()
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_events -> {
                //replaceFragment(AllEventsFragment())
                supportFragmentManager.beginTransaction().hide(SignInFragment()).commit()
                supportFragmentManager.beginTransaction().show(AllEventsFragment()).commit()
                if (currentUser.isNotEmpty()) {
                    updateRecyclerView()
                    sign_in_error?.visibility = View.INVISIBLE
                }
                return@OnNavigationItemSelectedListener true
            }
        }
        return@OnNavigationItemSelectedListener false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        supportFragmentManager.beginTransaction().add(R.id.activity_main, AllEventsFragment(), "2").commit()
        supportFragmentManager.beginTransaction().add(R.id.activity_main, SignInFragment(), "1").commit()
        val navView: BottomNavigationView = findViewById(R.id.nav_view)
        navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
        personInEvent = false
    }

结果是重叠的片段没有真正在它们之间导航的选项。我真的尝试了所有我知道的东西,互联网上有一些答案,但没有一个能帮助我解决我的问题。对于这个令人沮丧的问题,我非常感谢您的帮助。

导航前:

导航后:

【问题讨论】:

    标签: android android-fragments kotlin android-navigation-bar


    【解决方案1】:
    supportFragmentManager.beginTransaction().hide(AllEventsFragment()).commit()
    

    您每次都在重新创建片段! 调用AllEventsFragment() 等同于new AllEventsFragment()

    你需要先实例化它们 例如, 你的代码需要是这样的,

        val fragment1: Fragment = SignInFragment()
        val fragment2: Fragment = AllEventsFragment()
        var active = fragment1
    
          override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
                supportFragmentManager.beginTransaction().add(R.id.activity_main,fragment2 , "2").commit()
                supportFragmentManager.beginTransaction().add(R.id.activity_main, fragment1, "1").commit()
                val navView: BottomNavigationView = findViewById(R.id.nav_view)
                navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
                personInEvent = false
            }
    

    在你的听众中

        R.id.navigation_home -> {
                     supportFragmentManager.beginTransaction().beginTransaction().hide(active).show(fragment1).commit();
                        active = fragment1;
                    return@OnNavigationItemSelectedListener true
                }
     R.id.navigation_events -> {
                    //replaceFragment(AllEventsFragment())
                    supportFragmentManager.beginTransaction().beginTransaction().hide(active).show(fragment2).commit();
    active = fragment2
    )
    
        //handle rest of the cases 
    

    【讨论】:

    • 我发誓我试过这个 LOL,但现在它可以工作了,所以我没有抱怨,非常感谢!
    【解决方案2】:

    看看架构组件,你也可以用旧的方式实现Android - save/restore fragment state 当一个片段不可见时,它会暂停甚至可能被破坏,使用捆绑包来保存数据。 你想要达到的目标可以使用两个容器来完成,但你真的不应该

    【讨论】:

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