【问题标题】:How can I hide a fragment using supportFragmentManager?如何使用 supportFragmentManager 隐藏片段?
【发布时间】:2019-08-14 22:58:01
【问题描述】:

这是我的尝试:

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)
        }
    }

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

【问题讨论】:

  • val currentFragment = supportFragmentManager.fragments.last() 不能保证这是真的。

标签: android android-fragments fragmentmanager


【解决方案1】:

以这种方式访问​​片段不是一个好习惯(而且很可能不会起作用)。

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

您应该使用tag 添加片段,并在您想要删除片段时按标签获取片段,然后进行交易。

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

【讨论】:

    【解决方案2】:

    令人尴尬的是,我的问题是我无意中将 Fragment2 中的布局与 Fragment1 的布局进行了交换……所以它可以正常工作,但是因为它们共享一个布局,所以您无法直观地看到它。如果可以的话,我会删除这篇文章,但我会把它留在这里,以纪念我作为开发者的耻辱。

    【讨论】:

    • 同样,我不会使用这种方法。这可能会导致您的用户遇到问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2019-06-27
    相关资源
    最近更新 更多