ViewPagerがあり、各ページはフラグメントビューです。フラグメントが可視領域にあるかどうかをテストしたい。 Fragment.isVisibleのみのテスト
ViewPagerは3(デフォルト)のフラグメントを作成し、3つすべてが上記の基準を満たしますが、実際に表示されるのは1つだけです(人間目)
これを行うためのより良い方法があります!
FragmentPagerAdapter javadocオンラインをご覧ください。メソッドがあります setPrimaryItem(ViewGroup container、int position、Object object):void 必要なことを正確に実行します。
javadocから
public void setPrimaryItem(ViewGroupコンテナー、int位置、Objectオブジェクト)
どのアイテムが現在「プライマリ」と見なされているか、つまり現在のページとしてユーザーに表示されているアイテムをアダプターに通知するために呼び出されます。
パラメータcontainerページを削除するビューを含むビュー。 positionプライマリになったページの位置。 object instantiateItem(View、int)によって返されたのと同じオブジェクト。
スクロール状態に関する注意
これを実装してデバッグを開始すると、これが正確に呼び出されたときの感触をつかむことができます。これは、フラグメントの準備時およびユーザーがスワイプしているときにすぐにトリガーされることがすぐにわかります。
したがって、 ViewPager.OnPageChangeListener を付加し、ビューページャーのスクロール状態が SCOLL_STATE_IDLE になった後にのみ行うべきことを行うことも良い考えです。
これは、フラグメントの可視性を判断するために使用するものです。
private static boolean m_iAmVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
m_iAmVisible = isVisibleToUser;
if (m_iAmVisible) {
Log.d(localTAG, "this fragment is now visible");
} else {
Log.d(localTAG, "this fragment is now invisible");
}
}
私の目的では、ViewPager.OnPageChangeListener.onPageSelected()
をFragment.onActivityCreated()
と組み合わせて使用して、フラグメントが表示されたときにアクションを実行するようにしました。 Fragment.getUserVisibleHint()
も役立ちます。
この問題を解決するために「setMenuVisibility」メソッドを使用しています。すべてのフラグメントはアクションバー項目を持つことができるため、これはユーザーが現在どのフラグメントを表示できるかを決定できる部分です。
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (!visible) {
//not visible anymore
}else{
yay visible to the user
}
}
isVisible()
フラグメントがアクティビティの背後にある場合でも、trueを返すことができます。
私は次を使用しています:
if (getView() != null && getView().isShown()) {
//your code here
}
getView().isShown()
を使用してフラグメントが実際に表示されているかどうかを確認することの何が問題になっていますか?
各フラグメントがどの「ページ」にアタッチされているかがわかっている場合、ViewPager.getCurrentItem()を使用して、どのフラグメントが「表示」されているかを判別できます。
setUserVisibleHint
はおそらく呼び出されないかもしれませんが、onHiddenChanged
は別のフラグメントが閉じられるたびに呼び出されるとは限りません。そのため、onResume
(およびonPause
)に依存する場合がありますが、通常は頻繁に呼び出されます(たとえば、デバイス画面をオンにしたとき)。また、状況によっては呼び出されない場合、ホストアクティビティで現在のフラグメントを管理し、次のように記述する必要があります。
if (currentFragment != null) {
currentFragment.onResume();
}
私の場合、フラグメントがユーザーに表示されるときに最初のフラグメントでいくつかの作業を行う必要があります
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(viewPager.getAdapter() instanceof YourPager)
{
Fragment fragemnt=((YourPager)viewPager.getAdapter()).getFragment(0); //getFragment(int index) custom method
if( fragemnt instanceof YourFragment)
{
((YourFragment)fragemnt).methodWhochShouldBeCalledAfterUIVisible();
}
}
}
コトリン:
if (userVisibleHint) {
// the fragment is visible
} else {
// the fragment is not visible
}
Java
if (getUserVisibleHint()) {
// the fragment is visible
} else {
// the fragment is not visible
}
https://developer.Android.com/reference/Android/app/Fragment.html#getUserVisibleHint()