Ho un ViewPager che carica tre pagine alla volta. Se si scorre dalla pagina 1 alla pagina 2, quindi a 3, la prima pagina (frammento) passa a onPause()
. Quindi, se si passa alla seconda pagina, la prima pagina arriva a onResume()
anche se la pagina 1 non è ancora visibile all'utente. Quindi, la mia domanda è: come distinguere tra la prima e la seconda pagina nel codice? Ad esempio, se devo eseguire un pezzo di codice quando il frammento è visibile, come è fatto?Visualizza il ciclo di vita del cercapersone e dei frammenti
risposta
Il FragmentPagerAdapter conserva frammenti aggiuntivi, oltre a quello mostrato, ripresi. La soluzione è implementare un OnPageChangeListener personalizzato e creare un nuovo metodo per quando viene mostrato il frammento.
1) Creare l'interfaccia LifecycleManager L'interfaccia avrà due metodi e ciascun frammento di ViewPager lo implementerà. Questi metodi sono i seguenti:
public interface FragmentLifecycle {
public void onPauseFragment();
public void onResumeFragment();
}
2) Facciamo ogni frammento implementa l'interfaccia Aggiungi iplements dichiarazione per ogni dichiarazione di classe:
public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle
3) Implementare metodi di interfaccia in ogni frammento Al fine di verificare che in realtà funziona come previsto, mi limiterò a registrare la chiamata di metodo e spettacolo tostatura:
@Override
public void onPauseFragment() {
Log.i(TAG, "onPauseFragment()");
Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
@Override
public void onResumeFragment() {
Log.i(TAG, "onResumeFragment()");
Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
4) metodi di interfaccia chiamata in ViewPager cambio pagina È possibile impostare OnPageChangeListene r sul ViewPager e ottenere callback ogni momento in cui ViewPager mostra un'altra pagina:
pager.setOnPageChangeListener(pageChangeListener);
5) Implementare OnPageChangeListener per chiamare i metodi del ciclo di vita personalizzati
Listener conosce la nuova posizione e può chiamare il metodo di interfaccia sul nuovo frammento con l'aiuto di PagerAdapter. Posso qui chiamare onResumeFragment() per il nuovo frammento e onPauseFragment() su quello corrente.
Ho bisogno di memorizzare anche la posizione del frammento corrente (inizialmente la posizione corrente è uguale a 0), poiché non so se l'utente scorresse da sinistra a destra o da destra a sinistra. Vedere cosa intendo nel codice:
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
public void onPageScrollStateChanged(int arg0) { }
};
Non ho scritto il codice. tutorial completo qui: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/
getActivity() in onResumeFragment potrebbe restituire Null (almeno nel mio caso). La soluzione potrebbe essere quella di passare il contesto (o attività) tramite l'interfaccia. Per esempio. public void onResumeFragment (Attività dell'attività) – Pranaysharma
Nel mio caso 'getItem();' ha restituito il frammento senza visualizzazioni. L'ho risolto usando 'instantiateItem'. http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#instantiateItem(android.view.ViewGroup, int) – Alexey
Esempio: http://www.alexandroid.net/android/fragments/viewpager-fragments-onpageselectedonpageunselected/ – Alexey
metodo utente pager.setOffscreenPageLimit (numbr) per impostare il numero di frammenti che si desidera conservare nello stack.
Il valore predefinito è 1.Il che significa che il frammento precedente e quello successivo sono mantenuti in stato di riposo. – LordRaydenMK
view pager ha sempre un minimo di 3 pagine caricate alla volta.e la mia domanda è come ottengo una richiamata quando una delle pagine diventa visibile. – shreyas
se il Frammento estendere android.support.v4.app.Fragment
è possibile utilizzare questo, funziona per me.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!isVisibleToUser) {
//do sth..
}
}
quando il frammento viene creato per la prima volta, all'interno di questo metodo, 'getActivity()' o 'getContext()' restituirà null. Personalmente preferisco di più l'approccio 'onPageSelected()' –
Override setUserVisibleHint()
. Questo metodo chiamerà una volta che il frammento è visibile all'utente.
Override setUserVisibleHint() questo sarà chiamata quando frammento è visibile all'utente
- 1. Visualizza il ciclo di vita del controller su UIModalPresentationOverCurrentContext
- 2. Quando viene chiamato onActivityResult del frammento rispetto al ciclo di vita dei frammenti?
- 3. JManuale del ciclo di vita
- 4. Frammenti Android: metodo del ciclo di vita * sempre * chiamato quando viene visualizzato il frammento?
- 5. Ciclo di vita dei frammenti: quale metodo viene chiamato su mostra/nascondi?
- 6. Cassetto di navigazione e visualizza il cercapersone nella stessa attività
- 7. Visualizza cercapersone come lista Visualizza riga articolo
- 8. Reagire componenti del ciclo di vita, stato e redux
- 9. React animazioni del ciclo di vita
- 10. come funziona il ciclo di vita?
- 11. Ciclo di vita e serializzazione HttpServlet
- 12. Ciclo di vita e servizio dell'applicazione Android
- 13. Android View Ciclo di vita
- 14. Il ciclo di vita del servizio WCF ospitato in IIS
- 15. ViewBag/ViewData Ciclo di vita
- 16. Ciclo di vita Android SharedPreference
- 17. angularjs 1.x ciclo di vita del supporto
- 18. Quali eventi del ciclo di vita ASP.NET possono essere asincroni?
- 19. Frammento da Visualizza Cercapersone nascosto dietro Barra delle schede
- 20. test ngOnChanges gancio del ciclo di vita in angolare 2
- 21. Collegamento al ciclo di vita di un frammento come Application.ActivityLifecycleCallbacks
- 22. Verificare la durata del ciclo di vita e l'esistenza di file in Maven e segnalare l'errore
- 23. arresto eventi del ciclo di vita iOS5 automaticamente chiamati
- 24. Affidabilità del ciclo di vita dell'attività (onPause to onDestory)
- 25. Ciclo di vita del singleton basato su enum
- 26. Arresta un'app richiamando le callback del ciclo di vita
- 27. AsyncTask Android con l'attività del ciclo di vita
- 28. Eventi del ciclo di vita della pagina in xamarin.forms
- 29. Qual è il ciclo di vita di un controller AngularJS?
- 30. ASP.NET MVC Controller Ciclo di vita
check-out la mia risposta qui http://stackoverflow.com/questions/21914808/how-to-handle-asynctasks-in- actionbaractivity-fragments-when-viewpager-is-used/24386516 # 24386516 – LordRaydenMK
Risposta perfetta ... grazie ha funzionato. – shreyas