web-dev-qa-db-ja.com

フラグメントビューがユーザーに表示されるかどうかをテストする方法は?

ViewPagerがあり、各ページはフラグメントビューです。フラグメントが可視領域にあるかどうかをテストしたい。 Fragment.isVisibleのみのテスト

  • フラグメントはアクティビティに添付されます
  • フラグメントは可視に設定されます
  • フラグメントがビューに追加されました

ViewPagerは3(デフォルト)のフラグメントを作成し、3つすべてが上記の基準を満たしますが、実際に表示されるのは1つだけです(人間

71
David S.

これを行うためのより良い方法があります!

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 になった後にのみ行うべきことを行うことも良い考えです。

20
hcpl

これは、フラグメントの可視性を判断するために使用するものです。

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");
    }
}
67
miroslavign

私の目的では、ViewPager.OnPageChangeListener.onPageSelected()Fragment.onActivityCreated()と組み合わせて使用​​して、フラグメントが表示されたときにアクションを実行するようにしました。 Fragment.getUserVisibleHint()も役立ちます。

9
Leo Landau

この問題を解決するために「setMenuVisibility」メソッドを使用しています。すべてのフラグメントはアクションバー項目を持つことができるため、これはユーザーが現在どのフラグメントを表示できるかを決定できる部分です。

@Override
public void setMenuVisibility(final boolean visible) {
    super.setMenuVisibility(visible);
    if (!visible) {
        //not visible anymore
    }else{
        yay visible to the user
    }
}
3
Frame91
isVisible() 

フラグメントがアクティビティの背後にある場合でも、trueを返すことができます。

私は次を使用しています:

if (getView() != null && getView().isShown()) {
//your code here
}
3
Peter File

getView().isShown()を使用してフラグメントが実際に表示されているかどうかを確認することの何が問題になっていますか?

3
awy

各フラグメントがどの「ページ」にアタッチされているかがわかっている場合、ViewPager.getCurrentItem()を使用して、どのフラグメントが「表示」されているかを判別できます。

2
roflharrison

setUserVisibleHintはおそらく呼び出されないかもしれませんが、onHiddenChangedは別のフラグメントが閉じられるたびに呼び出されるとは限りません。そのため、onResume(およびonPause)に依存する場合がありますが、通常は頻繁に呼び出されます(たとえば、デバイス画面をオンにしたとき)。また、状況によっては呼び出されない場合、ホストアクティビティで現在のフラグメントを管理し、次のように記述する必要があります。

if (currentFragment != null) {
    currentFragment.onResume();
}
0
CoolMind

私の場合、フラグメントがユーザーに表示されるときに最初のフラグメントでいくつかの作業を行う必要があります

 @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();
        }
    }
}
0
W00di

コトリン:

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()

https://stackoverflow.com/a/12523627/2069407

0
s-hunter