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