如何知道碎片是否可见?

Pop*_*día 50 android android-fragments

我正在使用支持库v4,我的问题是,如何知道片段是否可见?如何更改碎片中膨胀的布局的属性?提前致谢.

- -编辑 - -

我在使用FragmentActivity的android开发人员教程中使用片段

Tro*_*omB 76

您应该能够执行以下操作:

MyFragmentClass test = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID");
if (test != null && test.isVisible()) {
     //DO STUFF
}
else {
    //Whatever
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上它将是`test!= null && test.isVisible()`否则当test为null时它会抛出`NullPointerException` (7认同)
  • 你可以通过`if(MyFragmentClass.this.isVisible())`来实现. (5认同)
  • 如果我们使用`FragmentPagerAdapter`在这个片段中添加更多片段怎么办? (2认同)
  • 在 findFragmentByTag() 中,必须在这里定义哪个标签? (2认同)

Y.S*_*Y.S 30

双方isVisible()isAdded()返回true为尽快Fragment创建,甚至没有实际可见.实际工作的唯一解决方案是:

if (isAdded() && isVisible() && getUserVisibleHint()) {
    // ... do your thing
}
Run Code Online (Sandbox Code Playgroud)

这样做了.期.

  • getUserVisibleHint() 现在已弃用 - 有什么替代方法? (13认同)
  • isVisible 检查 isAdded 因此 isAdded 在这里是多余的 (2认同)
  • isVisible 出现在 isAdded 之后。那么你能不能给出一个 isAdded 不起作用的场景,因为你提到了 isAdded 和 isVisible @YS (2认同)

Kay*_*n N 21

如果您想知道何时使用正在查看您应该使用的片段

yourFragment.isResumed()
Run Code Online (Sandbox Code Playgroud)

代替

yourFragment.isVisible()
Run Code Online (Sandbox Code Playgroud)

首先isVisible()已经检查了isAdded()所以不需要同时调用它们.其次,非这两个意味着用户实际上看到了你的片段.只isResumed()确保您的片段位于用户面前,如果您正在寻找,那么用户可以与其进行交互.

  • 这不起作用.虽然其中只有一个正在使用并且可见,但它为我提供了所有标签. (4认同)
  • 如果可以的话,美丽的答案和解释,一百万次 (2认同)

Cab*_*zas 14

你可以尝试这种方式:

Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragment_container);
Run Code Online (Sandbox Code Playgroud)

要么

Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
Run Code Online (Sandbox Code Playgroud)

在这个if中,检查currentFragment是否是YourFragment的实例

if (currentFragment instanceof YourFragment) {
     Log.v(TAG, "your Fragment is Visible");
}
Run Code Online (Sandbox Code Playgroud)


Mit*_*ech 9

getUserVisibleHint() 只有当片段在视图上并且可见时才会出现

  • 在 API 29 中已折旧 (4认同)
  • 可能的情况是可能会将片段添加到具有某些纯色背景的后堆栈中,因此最新的片段会将其他片段隐藏在屏幕上。 (2认同)

Mik*_*kel 8

您可以像这样覆盖setMenuVisibility:

@Override
public void setMenuVisibility(final boolean visible) {
   if (visible) {
      //Do your stuff here
   }

   super.setMenuVisibility(visible);
}
Run Code Online (Sandbox Code Playgroud)


log*_*gan 7

需要注意的一点是,isVisible()返回当前片段的可见状态.支持库中存在一个问题,如果您有嵌套的片段,并且隐藏了父片段(因此也隐藏了所有子片段),则子项仍然表示它是可见的.

isVisible()是最后的,所以不幸不能覆盖.我的解决方法是创建一个BaseFragment我的所有片段扩展的类,然后创建一个这样的方法:

public boolean getIsVisible()
{
    if (getParentFragment() != null && getParentFragment() instanceof BaseFragment)
    {
        return isVisible() && ((BaseFragment) getParentFragment()).getIsVisible();
    }
    else
    {
        return isVisible();
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做isVisible() && ((BaseFragment) getParentFragment()).getIsVisible();是因为我们想要隐藏任何父片段时返回false .

这似乎对我有用.