24

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

+1

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

+1

Risposta perfetta ... grazie ha funzionato. – shreyas

risposta

27

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/

+0

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

+3

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

+0

Esempio: http://www.alexandroid.net/android/fragments/viewpager-fragments-onpageselectedonpageunselected/ – Alexey

1

metodo utente pager.setOffscreenPageLimit (numbr) per impostare il numero di frammenti che si desidera conservare nello stack.

+3

Il valore predefinito è 1.Il che significa che il frammento precedente e quello successivo sono mantenuti in stato di riposo. – LordRaydenMK

+0

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

4

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.. 
    } 
} 
+0

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()' –

2

Override setUserVisibleHint(). Questo metodo chiamerà una volta che il frammento è visibile all'utente.

0

Override setUserVisibleHint() questo sarà chiamata quando frammento è visibile all'utente

Problemi correlati