0 votos
Hola, a ver si me podeis decir como solucionar este problema, el MainActivity tengo creado dos layout (una para la vista vertical y otra para la vista horizontal) donde tengo puesto un FloatingActionButton, que lo oculto cuando muestro un contenido en esa actividad, se oculta sin problemas, pero estando oculto si cambio la pantalla de posición, el FloatingActionButton vuelve aparecer.

 

¿como puedo dejarlo oculto hasta que yo quiera volver a mostrarlo?

 

P.D. Feliz Navidad.

 

Gracias.
preguntado por SuBc Dic 25, 2019 en Android

1 Respuesta

+1 voto
Mejor respuesta

Cuando rotas la pantalla, por defecto la Activity se vuelve a recargar, por lo que vuelve a pasar por el onCreate y vuelve todo al estado inicial. Para conservar los estados tienes dos opciones:

  • Automáticamente: definir en en Manifest, en la actividad la configuración de rotación para que se mantenga automáticamente con:
<activity name= "MiActivity" android:configChanges="orientation|screenSize"/>
  • A mano: es necesario guardar los estados en el bundle que se pasa en onSaveInstanceState y recargar el bundle con los estados en onRestoreInstanceState (o en el onCreate) cuando sea necesario.
String valor;

//Guardar un estado
protected void onSaveInstanceState(Bundle miBundle) {
  super.onSaveInstanceState(miBundle);
  miBundle.putString("clave", valor);
}

//Cargar un estado
protected void onRestoreInstanceState(Bundle miBundle) {
    super.onRestoreInstanceState(miBundle);
    valor = miBundle.getString("clave");
}

// O en el OnCreate para cargar el estado
public void onCreate(Bundle miBundle) {
    super.onCreate(miBundle);
    
    // Si existe un estado previo lo cargará, sino se establecerá el valor por defecto
    valor = miBundle.getString("clave", "Nuevo valor por defecto");
}

 

¡Feliz Navidad!

respondido por Ramon [Admin] Dic 26, 2019
seleccionada por SuBc Dic 27, 2019

Hola Ramon, en el Manifests tenía puesto este código:

android:configChanges="orientation|keyboardHidden|screenSize"

Aunque no creo que tenga nada que ver con que este puesto también el “keyboardHidden”, pero me toco quitar este código, porque tengo creada un layout para mostrar la ventana en vertical y otro layout distinto para mostrar la pantalla en horizontal, y al poner ese código no muestra el segundo layout al girar la pantalla.
Y con el onSaveInstanceState no me aclaro muy bien, estuve haciendo pruebas hace algún tiempo por otro motivo, ya que me interesaba guardar el estado de esa actividad para que no fuesen eliminados por el tema ese de los ciclos de vida, y cuando volviese a esa actividad me mostrase lo que tenía en ese momento que la deje, pero me lie con el código, igual que ahora que no me funciona y no se si es porque no lo estoy haciendo bien.

 

Este es el código que estoy utilizando para ocultar el boton FloatingActionButton

bSB.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                if (newState == BottomSheetBehavior.STATE_EXPANDED) {
                    fab.hide();
                }
                if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
                    fab.show();
                }
            }
            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {}

        });

 

Como te comento se oculta bien, pero al girar la pantalla vuelve aparecer. 

Me gustaría probar guarda el estado con el onSaveInstanceState, pero a ver si me puedes ayudar a intentarlo con esto, en el onCreate tengo puesto esto:

// variables para guardar el estado
static final String STATE_USER = "user";
private String mUser;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        mUser = savedInstanceState.getString(STATE_USER);
    } else {
        mUser = "NewUser";
    }
}

 

Y fuera del onCreate el código para guardar el estado,

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString(STATE_USER, mUser);
    super.onSaveInstanceState(savedInstanceState);
}

 

Pero si esto funciona bien, como y donde tengo que poner el código para Cargar un estado

P.D. estoy intentando poner el codigo para que se vea bien en el post, estoy escogiendo "Javascript"

Un saludo.

Creo que para lo que necesitas te bastaría con realizar la carga del estado en el onRestoreInstanceState y/o en el onCreate. Por ejemplo, podrías guardar el estado de un booleano (getBoolean y setBoolean respectivamente para obtener y guardar el estado) que indicara si se tiene que mostrar el botón o no, y en el onRestoreInstanceState y/o en el onCreate realizar el hide o el show de la view (del botón) dependiendo del booleano que te llegue.

Tienes todos los valores que ser pueden pasar en un Bundle en https://developer.android.com/reference/android/os/BaseBundle

Gracias, voy a repasar ese link.