Fragment isVisible()在不可见时返回true

8

我有一个带有片段容器和两个片段的活动,类似于“列表片段 -> 详细信息片段”。

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,因此第二个片段永远不会刷新。已经尝试过移除、分离,但都没有效果:第一个片段总是以添加和可见状态出现。在平板电脑和手机上进行了测试,情况也是一样的。也许我漏掉了什么,但无法正确解决,所以任何帮助将不胜感激。谢谢。


当您添加第二个片段时,您使用了add方法还是尝试替换当前片段? - fasteque
isVisible():如果片段当前对用户可见,则返回true。这意味着它:(1)已被添加,(2)其视图已附加到窗口,并且(3)未隐藏。请按照此处所述检查片段的隐藏状态:http://developer.android.com/reference/android/app/Fragment.html#onHiddenChanged(boolean),并调用isHidden()方法。 - fasteque
为了替换片段,我会先询问它是否已经被添加,如果已经添加,则调用replace()方法,否则调用add()方法。isHidden()的状态对于第一个片段来说是false,尽管它对用户不可见,实际上可见的片段是第二个片段。 - labreu
如果isHidden()返回false,那么根据文档,isVisible()将返回true。检查为什么第一个片段没有隐藏和/或如何通过编程设置它隐藏。 - fasteque
1
已经解决了。问题是我将2个firstFragment添加到fragmentManager中,所以当调用replace()时,片段没有被删除,可见状态从true永远不会改变(不知道为什么,我想因为有2个相同标签的逻辑是2个都被删除了),现在我设法始终只有1个片段在管理器中,所以它正常工作。无论如何,在支持库中的fragmentManager中有一些奇怪的东西,或者我在文档中理解错了。感谢@fasteque的时间和帮助。 - labreu
显示剩余3条评论
1个回答

0

在设置 fragment.setMenuUserVisibility(false) 后,尝试使用 fragment.isMenuVisible() 代替。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接