フラグメントビューがユーザーに表示されているかどうかをテストする方法は?
-
27-10-2019 - |
質問
ビューペーカーがあり、各ページはフラグメントビューです。フラグメントが目に見える領域にあるかどうかをテストしたいと思います。 fragment.isvisibleのみテスト
- フラグメントはアクティビティに取り付けられています
- フラグメントは見えるように設定されています
- フラグメントはビューに追加されました
ViewPagerは3(デフォルトで)フラグメントを作成し、3つすべてが上記の基準を満たしていますが、実際にはユーザー(人間)に見えるのは1人だけです。 目)
解決
あなたはこれを行うためのより良い方法があります!
を見てください fragmentpageradapter Javadoc Onlineでは、方法があることがわかります SetPrimaryItem(ViewGroup Container、int position、object object):void 必要なことを正確に行う。
Javadocから
public void setPrimaryitem(ViewGroup Container、int position、object object)
現在、どのアイテムが「プライマリ」と見なされているかをアダプターに通知するために呼び出されました。これは、現在のページとしてユーザーの1つのショーです。
パラメータコンテナページが削除されるコンテンツビュー。現在プライマリになっているページの位置を配置します。 Object instantiateItem(view、int)によって返されたのと同じオブジェクト。
スクロール状態に注意してください
これを実装してデバッグを開始して、これが正確に呼ばれるときに感触を取得すると、すぐにこれがフラグメントの準備で何度かトリガーされ、ユーザーがスワイプしている間にトリガーされていることに気付きます。
だから、また添付することは良い考えかもしれません viewpager.onpageChangelistener そして、ViewPagers Surloll Stateが次のとおりに行われなければならないことを行うだけです 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」 - methodを使用しています。すべてのフラグメントにアクションバーを持つことができるため、これはユーザーに現在表示されているフラグメントを決定できる部分です。
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (!visible) {
//not visible anymore
}else{
yay visible to the user
}
}
使用の何が問題になっていますか getView().isShown()
フラグメントが実際に見えるかどうかを確認するには?
isVisible()
フラグメントがアクティビティの背後にある場合でも、まだ真実を返すことができます。
私は次のことを使用しています:
if (getView() != null && getView().isShown()) {
//your code here
}
どの「ページ」が添付されているかを知っている場合、viewpager.getCurrentitem()を使用して、どのフラグメントが「表示される」かを決定できます。
私の場合、IAはフラグメントがユーザーに表示されているときに最初のフラグメントでいくつかの作業を行う必要があります
@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();
}
}
}
setUserVisibleHint
おそらく呼ばれないかもしれません、 onHiddenChanged
別のフラグメントが閉じられているときは、いつでも呼ばれない場合があります。だから、あなたは頼るかもしれません onResume
(と onPause
)、しかし、それは通常、あまりにも頻繁に呼ばれます(たとえば、デバイス画面をオンにするとき)。また、状況によっては呼ばれていません。ホストアクティビティで現在のフラグメントを管理し、次のことを書き込む必要があります。
if (currentFragment != null) {
currentFragment.onResume();
}
コトリン:
if (userVisibleHint) {
// the fragment is visible
} else {
// the fragment is not visible
}
ジャワ
if (getUserVisibleHint()) {
// the fragment is visible
} else {
// the fragment is not visible
}
https://developer.android.com/reference/android/app/fragment.html#getuservisiblehint()