studio programacion móviles desarrollo curso aplicaciones android android-fragments lifecycle fragmenttransaction

móviles - manual de programacion android pdf



Ciclo de vida del fragmento: ¿qué método se solicita mostrar/ocultar? (7)

Estoy usando el siguiente método para cambiar entre Fragmentos (en mi NavigationDrawer) mostrándolos / escondiéndolos.

protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if ( lastTag != null && !lastTag.equals("")) { Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag ); if ( lastFragment != null ) { transaction.hide( lastFragment ); } } if ( fragment.isAdded() ) { transaction.show( fragment ); } else { transaction.add( container, fragment, tag ); } if ( addToBackStack ) { transaction.addToBackStack( tag ); } transaction.commit(); // set the active tag activeFragTag = tag; }

Lo que no tengo claro es qué método del ciclo de vida de Fragments se llama cuando lo muestro u oculto? (dado que no hay ningún método como onShow () u onHide (), no estoy seguro de qué usar). Quiero realizar acciones específicas al mostrar y ocultar un Fragmento determinado.


Otra forma de llamar al método fragmento cuando el fragmento está visible y usa viewpager en la actividad.

// primero que nada creas una interfaz

public interface ShowFragmentVisible{ public void showFragment();}

// Después de eso, esta interfaz implementa dentro de Fragment así

public class MyFragment extends Fragment implements ShowFragmentVisible { @Override public void showFragment() { }

// Ahora va tu Actividad, luego crea el objeto de la interfaz y llama al interior cuando addOnViewpagerListener

ShowFragmentVisible showFragmentVisible; @Override public void onAttachFragment(Fragment fragment) { super.onAttachFragment(fragment); if (fragment instanceof ShowFragmentVisible) { showFragmentVisible = (ShowFragmentVisible) fragment; } } //your viewpager method viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position==0){ showFragmentVisible.showFragment(); } } @Override public void onPageScrollStateChanged(int state) { } }); this is another alternative,but its work for me successfully


Prueba este código:

@Override public void setUserVisibleHint(boolean visible) { super.setUserVisibleHint(visible); if (visible && isResumed()) { onResume(); } } @Override public void onResume() { super.onResume(); if (!getUserVisibleHint()) { return; } //Add your code this section }


Similar al ciclo de vida de la actividad, Android llama a onStart() cuando el fragmento se vuelve visible. onStop() normalmente se llama cuando el fragmento se vuelve invisible, pero también se puede llamar más adelante en el tiempo.

Dependiendo de su diseño, Android puede invocar onStart() incluso cuando su Fragmento aún no está visible, pero pertenece a un contenedor primario visible. Por ejemplo, esto es válido para android.support.v4.view.ViewPager que requiere que anule el método Fragment.setUserVisibleHint() . En cualquier caso, si necesita registrar / anular el registro de BroadcastReceivers u otros oyentes, puede usar de manera segura los onStart() y onStop() porque se onStop() siempre.

Nota: Algunos contenedores de fragmentos pueden mantener los fragmentos invisibles iniciados. Para manejar esta situación, puede anular Fragment.onHiddenChanged(boolean hidden) . De acuerdo con la documentation , un fragmento debe ser iniciado y visible (no oculto) , para que sea visible para el usuario.

Actualización: si usa android.support.v4.widget.DrawerLayout , un fragmento debajo del cajón permanece iniciado y visible incluso cuando el cajón está abierto. En este caso, necesita usar DrawerLayout.setDrawerListener() y escuchar las onDrawerClosed() de onDrawerClosed() de onDrawerClosed() y onDrawerOpened() .


Solo prueba esto en tu setUserVisibleHint ()

@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser && getView() != null){ isActive = true; init(); }else if(isVisibleToUser && getView() == null){ isActive = false; }else{ isActive = true; } }

Y crea este código en onCreateView () :

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if(!isActive){ init(); } }


Yo @Override este método y resolver mi problema:

@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (hidden) { //do when hidden } else { //do when show } }


setUserVisibleHint llamada antes de onCreateView . y no puedes actualizar ninguna Vista dentro de setUserVisibleHint que uso

public void setMenuVisibility(final boolean visible)

para la visibilidad y onHiddenChanged () no llamó por primera vez . llama cuando el estado oculto cambia. porque un fragment is visible by default . Para lograr este método por primera vez, debe llamar a mFragmentTransaction.hide(oldFragment) luego funcionará

Nota

si quieres usar setUserVisible hint y update View usa este método


fuera de curso puede @Overriede siguiente método para hacerlo:

@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Do your Work } else { // Do your Work } }