Ich habe einen ViewPager, jede Seite ist eine Fragmentansicht. Ich möchte testen, ob sich ein Fragment in einem sichtbaren Bereich befindet. Der Fragment.ist nur sichtbar
- Das Fragment ist an eine Aktivität gebunden
- Das Fragment ist sichtbar
- Das Fragment wurde einer Ansicht hinzugefügt
Der ViewPager erstellt 3 (standardmäßig) Fragmente und alle drei erfüllen die oben genannten Kriterien, aber nur eines ist für den Benutzer (das menschliche Auge ) tatsächlich sichtbar.
Antworten:
Sie haben Recht, es gibt einen besseren Weg, dies zu tun!
Wenn Sie sich das FragmentPagerAdapter- Javadoc online ansehen, werden Sie feststellen, dass es eine Methode setPrimaryItem gibt (ViewGroup-Container, int-Position, Objektobjekt): void genau das tun, was Sie brauchen.
Aus dem Javadoc
Hinweis zum Bildlaufstatus
Wenn Sie dies jetzt implementieren und mit dem Debuggen beginnen, um ein Gefühl dafür zu bekommen, wann genau dies aufgerufen wird, werden Sie schnell feststellen, dass dies mehrmals beim Vorbereiten des Fragments und beim Wischen des Benutzers ausgelöst wird.
Daher ist es möglicherweise eine gute Idee, auch einen ViewPager.OnPageChangeListener anzuhängen und erst dann das zu tun, was zu tun ist, wenn der Bildlaufstatus des Viewpagers wieder SCOLL_STATE_IDLE wird.
quelle
Application
Klasse erweitert und testen muss, ob eine bestimmte Benutzeroberfläche angezeigt wird. Am Ende habe ich mehrere Boolesche Werte verwendet, um zu testen, ob die App im Hintergrund ausgeführt wurde und ob ein bestimmtes Fragment angezeigt wurde.Dies ist, was ich benutze, um die Sichtbarkeit eines Fragments zu bestimmen.
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"); } }
quelle
public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); m_iAmVisible = false; //default to not visible if (isVisibleToUser) { m_iAmVisible = true; } }
getUserVisibleHint()
Für meine Zwecke hat es funktioniert,
ViewPager.OnPageChangeListener.onPageSelected()
in Verbindung mitFragment.onActivityCreated()
eine Aktion auszuführen, wenn das Fragment sichtbar ist.Fragment.getUserVisibleHint()
hilft auch.quelle
Ich verwende "setMenuVisibility" -Methode zur Lösung dieses Problems. Da jedes Fragment Aktionsleistenelemente enthalten kann, können Sie in diesem Teil bestimmen, welches Fragment derzeit für den Benutzer sichtbar ist.
@Override public void setMenuVisibility(final boolean visible) { super.setMenuVisibility(visible); if (!visible) { //not visible anymore }else{ yay visible to the user } }
quelle
Was ist falsch daran
getView().isShown()
, herauszufinden, ob ein Fragment tatsächlich sichtbar ist?quelle
isVisible()
Kann auch dann true zurückgeben, wenn sich das Fragment hinter einer Aktivität befindet.
Ich benutze folgendes:
if (getView() != null && getView().isShown()) { //your code here }
quelle
isShown
ist ähnlich ,getVisibility()
so dass es immer noch wahr zurück , wennVISIBLE
aber hinter einer AktivitätWenn Sie wissen, an welche "Seite" jedes Fragment angehängt ist, können Sie mithilfe von ViewPager.getCurrentItem () bestimmen, welches Fragment "sichtbar" ist.
quelle
In meinem Fall muss ich am ersten Fragment arbeiten, wenn das Fragment für den Benutzer sichtbar ist
@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(); } } }
quelle
setUserVisibleHint
wird wahrscheinlich nicht aufgerufen,onHiddenChanged
kann nicht jedes Mal aufgerufen werden, wenn ein anderes Fragment geschlossen wird. Sie können sich also aufonResume
(undonPause
) verlassen, dies wird jedoch normalerweise zu oft aufgerufen (z. B. wenn Sie einen Gerätebildschirm einschalten). In einigen Situationen, in denen es nicht aufgerufen wird, sollten Sie das aktuelle Fragment in der Hostaktivität verwalten und schreiben:if (currentFragment != null) { currentFragment.onResume(); }
quelle
Kotlin:
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
quelle