Come verificare se una vista di frammento è visibile all'utente?

Ho un ViewPager, each pagina è una vista di frammento. Voglio verificare se un frammento è in una regione visibile. il test Fragment.isVisible solo

  • il frammento è collegato ad un'attività
  • il frammento è impostato in modo visibile
  • il frammento è stato aggiunto a una vista

Il ViewPager creerà frammento 3 (per impostazione predefinita) e tutti e tre soddisfano i criteri di cui sopra, ma solo uno è visibile all'utente (gli occhi dell'uomo)

  • Uso di Target in Picasso sull'adattatore
  • maven supporto per i progetti android?
  • Cattura dell'evento di scheda Fare clic su Android Tabview
  • Come faccio a continuare ad eseguire un servizio tutto il tempo?
  • Come distriggersre pulsanti Home e altri sisthemes in Android?
  • Come posso posizionare la mia barra delle barre di azione nella parte destra?
  • Imposta OnClickListener per gli elementi in ListView con 2 Visualizzazioni
  • Come esplorare lo stile in android
  • java.lang.SecurityException: Denial of Permission: provider di apertura com.google.android.apps.photos.content.GooglePhotosImageProvider
  • Memorizza l'image di Blobstore da un client android e recupera il blobkey e carica url per memorizzare in Datastore. - GAE
  • la geolocalizzazione di javascript su android non funziona
  • uscire dall'applicazione android in modo programmato
  • 9 Solutions collect form web for “Come verificare se una vista di frammento è visibile all'utente?”

    Hai ragione c'è un modo migliore per farlo!

    Dai un'occhiata al FragmentPagerAdapter javadoc online e vedrai che c'è un metodo setPrimaryItem (contenitore ViewGroup, int posizione, object object): non funziona esattamente quello di cui hai bisogno.

    Dal javadoc

    public void setPrimaryItem (contenitore ViewGroup, int posizione, object object)

    Chiamato per informare l'adattatore di quale elemento è attualmente considerato come "primario", che è l'unico spettacolo all'utente come pagina corrente.

    Contenitore dei parametri La vista contenente da cui verrà rimossa la pagina. posizione La posizione della pagina che è ora primaria. object Lo stesso object restituito da istantiateItem (Visualizza, int).

    Nota dello stato di scorrimento

    Ora se implementi questa operazione e avvia il debug per avere un'idea quando esattamente questo si chiama, notenetworking rapidamente che questo viene triggersto più volte nella preparazione del frammento e mentre l'utente sta spianando.

    Quindi potrebbe essere una buona idea anche associare un ViewPager.OnPageChangeListener e fare solo quello che deve essere fatto una volta che lo stato di scorrimento di viewpagers diventa di nuovo SCOLL_STATE_IDLE .

    Questo è ciò che uso per determinare la visibilità di un frammento.

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

    Per i miei scopi, ha funzionato per utilizzare ViewPager.OnPageChangeListener.onPageSelected() in combinazione con Fragment.onActivityCreated() per eseguire un'azione quando il frammento è visibile. Fragment.getUserVisibleHint() aiuta anche.

    Cosa non va nell'utilizzo di getView().isShown() per scoprire se un frammento è effettivamente visibile?

     isVisible() 

    Può ancora restituire vero anche se il frammento è dietro un'attività.

    Sto utilizzando le seguenti:

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

    Sto utilizzando "setMenuVisibility" -Metodo per risolvere questo problema. Poiché each frammento può avere elementi di azione, questa è la parte in cui è ansible determinare quale Fragmento è attualmente visibile all'utente.

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

    Se sai quale "pagina" each frammento è collegato a voi potrebbe utilizzare ViewPager.getCurrentItem () per determinare quale frammento è "visibile".

    Nel mio caso devo fare un certo lavoro sul primo frammento quando il frammento è visibile all'utente

      @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 probabilmente non può essere chiamato, onHiddenChanged può essere chiamato non each volta che un altro frammento viene chiuso. Quindi puoi contare su onResume (e onPause ), ma di solito è chiamato troppo spesso (ad esempio quando si accende una schermata di un dispositivo). Anche in alcune situazioni non viene chiamato, è necessario gestire il frammento corrente nell'attività host e scrivere:

     if (currentFragment != null) { currentFragment.onResume(); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.