如何使用supportFragmentManager隐藏片段?

时间:2019-08-14 22:58:01

标签: android android-fragments fragmentmanager

这是我的尝试:

private inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
        beginTransaction().func().addToBackStack(null).commit()
    }

private fun AppCompatActivity.addFragment(fragment: Fragment, frameId: Int){
        supportFragmentManager.inTransaction { add(frameId, fragment) }
    }

private fun AppCompatActivity.showFragment(fragment: Fragment) {
        supportFragmentManager.inTransaction{show(fragment)}
    }

private fun showFragmentView(fragment: Fragment){

        // Hide the current Fragment
        if (supportFragmentManager.fragments.isNotEmpty()) {
            val currentFragment = supportFragmentManager.fragments.last()
            if (currentFragment != null) {
                supportFragmentManager
                        .beginTransaction()
                        .hide(currentFragment)
                        .commit()
            }
        }

        // Add or Show
        if (!fragment.isAdded) {
            addFragment(fragment, sendFragFrame.id)
        } else {
            showFragment(fragment)
        }
    }

它将片段适当地添加到框架中,但是当我尝试隐藏它时,什么也没有发生,它保持可见并且看不到第二个片段。有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

以这种方式访问​​片段不是一种好习惯(而且很可能行不通)。

  if (supportFragmentManager.fragments.isNotEmpty()) {
            val currentFragment = supportFragmentManager.fragments.last()
            if (currentFragment != null) {
                supportFragmentManager
                        .beginTransaction()
                        .hide(currentFragment)
                        .commit()

您应添加带有tag的片段,并在要删除片段并进行交易时按标签获取片段。

有关此内容的更多信息,请参见: How do I get the currently displayed fragment?

答案 1 :(得分:0)

令人尴尬的是,我的问题是我无意间将Fragment2中的布局与Fragment1的布局交换了起来,所以它确实起作用了,但是由于它们共享一个布局,因此您无法从视觉上看到它。如果可以的话,我会删除此帖子,但为了纪念我作为开发人员的耻辱,我将其保留在此处。