androidx.fragment.app.Fragment中的setUserVisibleHint吗?已弃用?为什么不执行?

lim*_*xin 5 android androidx

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (getUserVisibleHint()) {
        isVisible = true;
        onVisible();
    } else {
        isVisible = false;
        onInVisible();
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现这部分代码没有执行。

Yup*_*upi 13

现在 inAndroidX方法setUserVisibleHint(boolean isVisibleToUser)已被弃用,如果您查看文档,它会说:

现在,您可以设置最高Lifecycle的呼吁片段状态 setMaxLifecycle()FragmentTransaction。这取代了现在已弃用的setUserVisibleHint(). FragmentPagerAdapterFragmentStatePagerAdapter有一个新的构造函数,允许您切换到新的行为。

所以基本上当你使用这种方法时FragmentTransaction

.getSupportFragmentManager()
            .beginTransaction()
            .setMaxLifecycle(fragment, Lifecycle.State.STARTED);
Run Code Online (Sandbox Code Playgroud)

将等价于setUserVisibleHint(false)和:

.getSupportFragmentManager()
            .beginTransaction()
            .setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
Run Code Online (Sandbox Code Playgroud)

将相当于: setUserVisibleHint(true)


luk*_*jar 11

他们只是在Fragments中更改了API。

如果使用此方法限制片段生命周期:

现在,您可以通过在FragmentTransaction上调用setMaxLifecycle()来为Fragment设置最大生命周期状态。这将替换现在不推荐使用的setUserVisibleHint()。

来源:https : //developer.android.com/jetpack/androidx/releases/fragment#1.1.0-alpha07

如果您需要此方法是因为您尝试检测当前在中可见的片段ViewPager。现在,您可以只使用onResumeonPause方法,但是在此之前,您应该更改FragmentPagerAdapter构造函数中的默认行为。

像这样:

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
Run Code Online (Sandbox Code Playgroud)

  • 如果 Fragment 不是 ViewPager 的一部分怎么办?我需要通知其他类片段在屏幕上显示或消失。有什么解决办法吗? (11认同)

小智 11

此答案假定您正在使用 FragmentStatePagerAdapter

androidx.fragment(从 1.1.0+ 开始)的新版本上,Fragment.setUserVisibleHint如果您FragmentStatePagerAdapter使用由BEHAVIOR_SET_USER_VISIBLE_HINT.

如果你已经构造了你的FragmentStatePagerAdapter并且通过了BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT,那么Fragment.setUserVisibleHint就不会再调用里面了FragmentStatePagerAdapter.instantiateItem

注意:Fragment.getUserVisibleHint如果您在 中指定BEHAVIOR_SET_USER_VISIBLE_HINT,您仍然可以调用 deprecated FragmentStatePagerAdapter,但请注意,true即使Fragment.isResumed()将返回 false ,它也会返回。


androidx项目是开源的。通过查看master上的最新代码,可以看到里面if已经添加了一个:https : //android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/fragment/fragment/ src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java#195setUserVisibleHintinstantiateItem

  • 特尔;博士:

1.0.x:

fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
Run Code Online (Sandbox Code Playgroud)

1.1.0+:

fragment.setMenuVisibility(false);
if (mBehavior == BEHAVIOR_SET_USER_VISIBLE_HINT) {
    fragment.setUserVisibleHint(false);
}
Run Code Online (Sandbox Code Playgroud)