@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInVisible();
}
}
コードのこの部分が実行されていないことがわかりました。
彼らはフラグメントの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)
現在、AndroidX
メソッドではsetUserVisibleHint(boolean isVisibleToUser)
が非推奨になり、ドキュメントをよく見ると次のように記載されています。
Lifecycle
に対してsetMaxLifecycle()
を呼び出すことにより、フラグメントの最大FragmentTransaction
状態を設定できるようになりました。これは、現在非推奨のsetUserVisibleHint()
に代わるものです。FragmentPagerAdapter
とFragmentStatePagerAdapter
には、新しい動作に切り替えることができる新しいコンストラクターがあります。
したがって、基本的にはこのアプローチをFragmentTransaction
で使用する場合:
_.getSupportFragmentManager()
.beginTransaction()
.setMaxLifecycle(fragment, Lifecycle.State.STARTED);
_
setUserVisibleHint(false)
と同等です。
_.getSupportFragmentManager()
.beginTransaction()
.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
_
setUserVisibleHint(true)
と同等です。
この回答は、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
の内部にsetUserVisibleHint
がinstantiateItem
内に追加されていることがわかります: 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);
}
_