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


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.


73
2017-08-22 08:30


origen


Respuestas:


Similar al ciclo de vida de la actividad, llamadas de Android 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 tarde en el tiempo.

Según su diseño, Android puede llamar onStart() incluso cuando su Fragmento aún no está visible, pero pertenece a un contenedor padre visible. Por ejemplo, esto es válido para android.support.v4.view.ViewPager que requiere que anule Fragment.setUserVisibleHint() método. En cualquier caso, si necesita registrar / anular el registro de BroadcastReceivers u otros oyentes, puede usar de forma segura onStart() y onStop() métodos porque esos serán llamados 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 documentación, un fragmento debe ser ambos iniciado y visible (no oculto), para ser visible para el usuario.

Actualizar: Si utiliza android.support.v4.widget.DrawerLayout luego, un fragmento debajo del cajón permanece abierto y visible incluso cuando el cajón está abierto. En este caso necesitas usar DrawerLayout.setDrawerListener() y escucha onDrawerClosed() y onDrawerOpened() devoluciones de llamada.


89
2017-08-22 08:47



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
    }
}

46
2017-12-24 05:39



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
        }
    }

30
2017-08-22 08:38



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
}

1
2017-08-11 09:50



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

0
2018-06-20 02:58



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

public void setMenuVisibility(final boolean visible)

para 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 mFragmentTransaction.hide(oldFragment) entonces funcionará

Nota 

si quieres usar setUserVisible hint y actualizar View Usa este método


0
2017-10-07 06:45



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

0
2018-02-17 05:02



Por supuesto que podrías anular setUserVisibleHint o setMenuVisibility pero si necesitas acceder Context o Activity, serán nulos allí! Hay otro método onStart que siempre tiene el contexto disponible, pero solo se llamará una vez que se crea el fragmento y si comienzas a moverte entre tus fragmentos en un buscapersonas, verás que no se llamará en la segunda vista y luego.

Entonces ... ¿qué hacer ahora?

La solución es bastante fácil, use onStart para la primera visita y setMenuVisibility para más tarde. Tu código probablemente se verá a continuación:

Clase de fragmento:

public class MyFragmentClass{
    private boolean isCurrentVisible = false;
...

@Override
public void onStart() {
    super.onStart();
    if (isCurrentVisible)
        doSth();
}

@Override
public void setMenuVisibility(boolean menuVisible){
    super.setMenuVisibility(menuVisible);
    this.isCurrentVisible = menuVisible;
    if(menuVisible && getContext() != null)
        doSth();
}

De esta manera Context siempre estará disponible para doSth() método.


0
2017-08-01 08:49