片段 isVisible() 不成立时为真

Posted

技术标签:

【中文标题】片段 isVisible() 不成立时为真【英文标题】:Fragment isVisible() true when not 【发布时间】:2013-10-25 02:39:40 【问题描述】:

我有一个带有片段容器和两个片段的活动,如“列表片段 -> 详细片段”

private boolean isFirstFragmentAdded() 
    return getSupportFragmentManager().findFragmentByTag("FIRST_FRAGMENT_TAG") != null;


private boolean isFirstFragmentVisible() 
    return getSupportFragmentManager().findFragmentByTag("FIRST_FRAGMENT_TAG").isVisible();


private boolean isSecondFragmentAdded() 
    return getSupportFragmentManager().findFragmentByTag("SECOND_FRAGMENT_TAG") != null;


private boolean isSecondFragmentVisible() 
    return getSupportFragmentManager().findFragmentByTag("SECOND_FRAGMENT_TAG").isVisible();


private void addFirstFragment() 
    firstFragment = new FirstFragment();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment, "FIRST_FRAGMENT_TAG").commit();


private void showFirstFragment() 
    firstFragment = new FirstFragment();
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, firstFragment, "FIRST_FRAGMENT_TAG").commit();


private void addSecondFragment() 
    secondFragment = new SecondFragment();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, secondFragment, "SECOND_FRAGMENT_TAG").commit();


private void showSecondFragment() 
    secondFragment = new SecondFragment();      getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, secondFragment, "SECOND_FRAGMENT_TAG").commit();


private void refreshVisibleFragment() 
    if (isFirstFragmentAdded() && isFirstFragmentVisible()) 
        refreshFirstFragment();
     else if (isSecondFragmentAdded() && isSecondFragmentVisible()) 
        refreshSecondFragment();
    

问题是即使我的第二个片段可见,第一个片段总是返回isVisible() == true,所以第二个片段永远不会刷新。已经尝试删除、分离,但没有任何效果:第一个片段始终显示为已添加且可见。还在平板电脑和手机上测试它,同样的事情也会发生。也许我遗漏了一些东西,但无法正确处理,因此我们将不胜感激。谢谢

【问题讨论】:

添加第二个fragment时,是使用add还是也尝试过替换当前fragment? isVisible():如果片段当前对用户可见,则返回 true。这意味着它:(1) 已添加,(2) 其视图已附加到窗口,并且 (3) 未隐藏。检查片段的隐藏状态,如下所述:developer.android.com/reference/android/app/… 并调用 isHidden() 方法。 要替换片段,我询问它是否已经添加,如果添加则调用replace(),如果不调用add()。第一个片段的 isHidden() 状态为假,而对用户不可见,可见片段是第二个 如果 isHidden() 返回 false,那么根据文档,isVisible() 将返回 true。检查为什么第一个片段没有隐藏和/或如何以编程方式将其设置为隐藏。 已修复。问题是我将 2 firstFragment 添加到 fragmentManager 中,所以当调用 replace() 时,片段没有被删除,可见性状态永远不会从 true 改变(不知道为什么,我想 coz 是 2 具有相同的标签但逻辑是 2 已被删除)现在我设法在管理器中始终只有 1 个片段,所以它工作正常。无论如何,支持库中的 fragmentManager 有一些奇怪的东西,或者我在文档中弄错了。感谢@fasteque 的时间和帮助 【参考方案1】:

试试 fragment.isMenuVisible() 而不是在设置fragment.setMenuUserVisibility(false) 之后

【讨论】:

以上是关于片段 isVisible() 不成立时为真的主要内容,如果未能解决你的问题,请参考以下文章

java流程控制

JavaScript入门

写sql时,使用where 1=1进行条件拼接时 如果第一个条件不成立时,后面的条件会继续执行吗

python语句

判断语句

Excel IF函数啥时候只要两个参数