web-dev-qa-db-ja.com

androidx.fragment.app.Fragment、setUserVisibleHint()は非推奨であり、実行されません。なぜですか?

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

コードのこの部分が実行されていないことがわかりました。

18
limengxin

彼らはフラグメントのAPIを変更しました。

この方法を使用してフラグメントのライフサイクルを制限する場合:

FragmentTransactionでsetMaxLifecycle()を呼び出すことにより、フラグメントの最大ライフサイクル状態を設定できるようになりました。これは、現在非推奨のsetUserVisibleHint()に代わるものです。

ソース: https://developer.Android.com/jetpack/androidx/releases/fragment#1.1.0-alpha07

現在ViewPagerに表示されているフラグメントを検出しようとしたため、このメソッドが必要な場合。代わりにonResumeおよびonPauseメソッドを使用できますが、その前にFragmentPagerAdapterコンストラクターのデフォルトの動作を変更する必要があります。

このような:

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
32
lukjar

現在、AndroidXメソッドではsetUserVisibleHint(boolean isVisibleToUser)が非推奨になり、ドキュメントをよく見ると次のように記載されています。

Lifecycleに対してsetMaxLifecycle()を呼び出すことにより、フラグメントの最大FragmentTransaction状態を設定できるようになりました。これは、現在非推奨のsetUserVisibleHint()に代わるものです。 FragmentPagerAdapterFragmentStatePagerAdapterには、新しい動作に切り替えることができる新しいコンストラクターがあります。

したがって、基本的にはこのアプローチをFragmentTransactionで使用する場合:

_.getSupportFragmentManager()
            .beginTransaction()
            .setMaxLifecycle(fragment, Lifecycle.State.STARTED);
_

setUserVisibleHint(false)と同等です。

_.getSupportFragmentManager()
            .beginTransaction()
            .setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
_

setUserVisibleHint(true)と同等です。

5
Yupi

この回答は、FragmentStatePagerAdapterを使用していることを前提としています

_androidx.fragment_の新しいバージョン(1.1.0以降)では、FragmentStatePagerAdapterが_Fragment.setUserVisibleHint_で指定された古い動作を使用している場合、_BEHAVIOR_SET_USER_VISIBLE_HINT_は引き続き呼び出されます。

FragmentStatePagerAdapterを作成して_BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT_を渡した場合、_Fragment.setUserVisibleHint_は_FragmentStatePagerAdapter.instantiateItem_内で呼び出されなくなります。

注:FragmentStatePagerAdapterで_Fragment.getUserVisibleHint_を指定した場合でも、廃止された_BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT_を呼び出すことができますが、 Fragment.isResumed()がfalseを返す場合でも、trueを返すことに注意してください。


androidxプロジェクトはオープンソースです。マスターの最新のコードを見ると、ifの内部にsetUserVisibleHintinstantiateItem内に追加されていることがわかります: https:// Android。 googlesource.com/platform/frameworks/support/+/androidx-master-dev/fragment/fragment/src/main/Java/androidx/fragment/app/FragmentStatePagerAdapter.Java#195

TL; DR:

1.0.x:

_fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
_

1.1.0以降:

_fragment.setMenuVisibility(false);
if (mBehavior == BEHAVIOR_SET_USER_VISIBLE_HINT) {
    fragment.setUserVisibleHint(false);
}
_
0
TheDerputy