it-swarm.com.de

Wie testen Sie, ob eine Fragmentansicht für den Benutzer sichtbar ist?

Ich habe einen ViewPager, jede Seite ist eine Fragmentansicht. Ich möchte testen, ob sich ein Fragment in einem sichtbaren Bereich befindet. Nur der Fragment.isVisible-Test

  • das Fragment ist an eine Aktivität gebunden
  • das Fragment ist auf sichtbar gesetzt
  • das Fragment wurde einer Ansicht hinzugefügt

Der ViewPager erstellt 3 Fragmente (standardmäßig), und alle drei erfüllen die oben genannten Kriterien, aber nur einer ist für den Benutzer sichtbar (der Mensch Augen ).

68
David S.

Du hast recht, es gibt einen besseren Weg, dies zu tun! 

Schauen Sie sich das FragmentPagerAdapter javadoc online an und Sie werden sehen, dass es eine Methode setPrimaryItem (ViewGroup-Container, int-Position, Object-Objekt) gibt: void macht genau das, was Sie brauchen.

Aus dem Javadoc

public void setPrimaryItem (ViewGroup-Container, int-Position, Objektobjekt)

Wird aufgerufen, um den Adapter darüber zu informieren, welches Element derzeit als .__ betrachtet wird. "primär" sein, das ist diejenige, die dem Benutzer als aktuell angezeigt wird Seite.

Parametercontainer Die enthaltende Ansicht, aus der die Seite erstellt wird entfernt. position Die Seitenposition, die jetzt die primäre Position ist . object Das gleiche Objekt, das von instantiateItem (View, int) zurückgegeben wurde.

Hinweis zum Bildlaufstatus

Wenn Sie dies nun 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, einen ViewPager.OnPageChangeListener anzufügen und nur dann zu tun, wenn der Bildlaufstatus des Viewpagers erneut in SCOLL_STATE_IDLE geändert wird.

20
hcpl

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

Für meine Zwecke funktionierte es, mit ViewPager.OnPageChangeListener.onPageSelected() zusammen mit Fragment.onActivityCreated() eine Aktion auszuführen, wenn das Fragment sichtbar ist. Fragment.getUserVisibleHint() hilft auch.

9
Leo Landau

Ich verwende "setMenuVisibility" -Methode, um dieses Problem zu lösen. Da jedes Fragment über actionbar-Elemente verfügen kann, können Sie hier bestimmen, welches Fragment für den Benutzer derzeit sichtbar ist.

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

Kann immer noch true zurückgegeben werden, auch wenn das Fragment hinter einer Aktivität steht.

Ich verwende Folgendes:

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

Was ist falsch an der Verwendung von getView().isShown(), um herauszufinden, ob ein Fragment tatsächlich sichtbar ist?

3
awy

Wenn Sie wissen, an welche Seite jedes Fragment angehängt ist, können Sie mit ViewPager.getCurrentItem () ermitteln, welches Fragment "sichtbar" ist.

2
roflharrison

setUserVisibleHint wird möglicherweise nicht aufgerufen, onHiddenChanged wird möglicherweise nicht jedes Mal aufgerufen, wenn ein anderes Fragment geschlossen wird. Sie können sich also auf onResume (und onPause) verlassen, aber es wird normalerweise zu oft aufgerufen (z. B. wenn Sie einen Gerätebildschirm einschalten). In einigen Situationen wird es auch nicht aufgerufen. Sie sollten das aktuelle Fragment in der Host-Aktivität verwalten und schreiben:

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

In meinem Fall muss ich erst 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();
        }
    }
}
0
W00di

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

0
s-hunter