片段管理访问错误可见 return false

Posted

技术标签:

【中文标题】片段管理访问错误可见 return false【英文标题】:Fragment management access error visible return false 【发布时间】:2022-01-13 22:19:50 【问题描述】:

我将片段管理为显示和隐藏。 但是当我尝试在一个片段中访问该方法时,我得到了 null 并且我问了这个问题。 当然,方法访问在其他管理相同的片段中也很有效。

这是我的隐藏代码。

private fun replaceFragment(fragment: Fragment) 
        supportFragmentManager.beginTransaction().apply 
            if (fragment.isAdded) 
                show(fragment)
             else 
                add(R.id.container_activity_main, fragment)
            

            supportFragmentManager.fragments.forEach 
                if (it != fragment && it.isAdded) 
                    hide(it)
                
            
        .commit()
    

我的节目代码

supportFragmentManager.beginTransaction().show(fragmentName).commit()

为问题任意指定fragmentName

如果您记录下面的代码,则会显示 false、false 和 true。

$fragmentName!!.isVisible, $fragmentName!!.isDetached ,$fragmentName!!.userVisibleHint

这里的片段对我来说是可见的,但 isVisible 总是返回 false 。 我不知道为什么会这样。

即使在 hide 中调用了 onStop,如果显示,则调用 onCreateView 并且应该有一个视图,但是视图变为 null 并且应用程序不起作用。

我不知道为什么会这样。 视图可见,但可见返回 false。

【问题讨论】:

【参考方案1】:

对于可见性问题,您应该使用:

     fragment.userVisibleHint

代替:

     fragment.isVisible

就像documentation中提到的那样。

Fragment.isVisible 不适用于所有片段用例,只有在 fragment.isAdded == true、fragment.isHidden == false、fragment.view != null、fragment.view.windowToken != 时才能为 true null 和 fragment.view.visibility == View.VISIBLE。 只有在片段的实现中满足所有这些条件时,isVisible 方法才会返回 true。

【讨论】:

我的问题是为什么 fragment.isVisible 返回 false 明白。你是说即使屏幕可见,只要其中任何一个为假就返回假? @Duseop 是的,完全正确【参考方案2】:

commit() 是一个异步方法,将在稍后完成。如果您在提交后立即输出日志 - 操作可能尚未完成

【讨论】:

即使你不马上打印出来,它也是那样出来的。我已经在屏幕显示后每隔 10 秒拉出一次日志,但还是那样。

以上是关于片段管理访问错误可见 return false的主要内容,如果未能解决你的问题,请参考以下文章

添加片段后,前一个片段仍然可见

当添加权限为 False 时,Django-grappelli 添加按钮在内联中可见

更改组件可见性时 Android Studio 空对象引用错误

没有可见的@interface 声明选择器错误 [关闭]

设置 debug = False 会使 Django 应用程序崩溃并出现以下错误,如何解决?

方向更改时不可见的片段