with viewpager studio showing not example activity android android-fragments android-viewpager android-lifecycle

android - viewpager - Ver el ciclo de vida de buscapersonas y fragmentos



tabbed activity android studio (5)

Tengo un ViewPager que carga tres páginas a la vez. Si deslizo desde la página 1 a la página 2 y luego a 3, la primera página (fragmento) va a onPause() . Luego, si onResume() dedo a la segunda página, la primera página aparece en onResume() aunque la página 1 todavía no esté visible para el usuario. Entonces, mi pregunta es: ¿cómo distinguir entre la primera y la segunda página en el código? Por ejemplo, si tengo que ejecutar un fragmento de código cuando el fragmento está visible, ¿cómo se hace?


FragmentPagerAdapter guarda fragmentos adicionales, además del que se muestra, en estado reanudado. La solución es implementar un OnPageChangeListener personalizado y crear un nuevo método para cuando se muestre el fragmento.

1) Crear interfaz LifecycleManager La interfaz tendrá dos métodos y cada Fragmento de ViewPager lo implementará. Estos métodos son los siguientes:

public interface FragmentLifecycle { public void onPauseFragment(); public void onResumeFragment(); }

2) Permitir que cada Fragmento implemente la instrucción de complementos de interfaz para cada declaración de clase:

public class FragmentBlue extends Fragment implements FragmentLifecycle public class FragmentGreen extends Fragment implements FragmentLifecycle public class FragmentPink extends Fragment implements FragmentLifecycle

3) Implementar métodos de interfaz en cada fragmento. Para comprobar que realmente funciona como se espera, simplemente registraré la llamada al método y mostraré Toast:

@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) Métodos de interfaz de llamada en el cambio de página de ViewPager. Puede configurar OnPageChangeListener en ViewPager y obtener una devolución de llamada cada vez que ViewPager muestre otra página:

pager.setOnPageChangeListener(pageChangeListener);

5) Implemente OnPageChangeListener para llamar a sus métodos personalizados de Lifecycle

El oyente conoce la nueva posición y puede llamar al método de interfaz en el nuevo Fragmento con la ayuda de PagerAdapter. Aquí puedo invocar onResumeFragment () para el nuevo fragmento y onPauseFragment () en el actual.

Necesito almacenar también la posición del fragmento actual (inicialmente la posición actual es igual a 0), ya que no sé si el usuario se desplazó de izquierda a derecha o de derecha a izquierda. Vea lo que quiero decir en el código:

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

No escribí el código. Tutorial completo aquí: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/


Método de usuario pager.setOffscreenPageLimit (numbr) para establecer cuántos fragmentos quieres que se guarden en la pila.


Reemplazar setUserVisibleHint() . Este método llamará una vez que el fragmento sea visible para el usuario.


si su Fragmento extiende android.support.v4.app.Fragment

Puedes usar esto, me funciona.

@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (!isVisibleToUser) { //do sth.. } }


Alterar setUserVisibleHint () esto invocará cuando el fragmento esté visible para el usuario