Pregunta Actividad reiniciar en rotación Android


En mi aplicación Android, cuando giro el dispositivo (deslizo el teclado), entonces mi Activity se reinicia (onCreate se llama). Ahora, esta es probablemente la forma en que se supone que debe ser, pero hago una gran cantidad de configuración inicial en el onCreate método, entonces necesito cualquiera:

  1. Ponga toda la configuración inicial en otra función para que no todo se pierda en la rotación del dispositivo o
  2. Hazlo tan onCreate no se llama de nuevo y el diseño simplemente se ajusta o
  3. Limite la aplicación solo al retrato para que onCreate no es llamado.

1222
2018-01-19 00:28


origen


Respuestas:


Usando la clase de aplicación

Dependiendo de lo que esté haciendo en su inicialización, podría considerar crear una nueva clase que se extienda Application y moviendo su código de inicialización en un sobrescrito onCreate método dentro de esa clase.

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

los onCreate en la clase de la aplicación solo se llama cuando se crea toda la aplicación, por lo que la actividad se reinicia en la orientación o los cambios de visibilidad del teclado no la desencadenarán.

Es una buena práctica exponer la instancia de esta clase como singleton y exponer las variables de la aplicación que está inicializando utilizando getters y setters.

NOTA: Deberá especificar el nombre de su nueva clase de aplicación en el manifiesto para que se registre y use:

<application
    android:name="com.you.yourapp.MyApplicationClass"

Reaccionando a los cambios de configuración  [ACTUALIZACIÓN: esto está en desuso desde la API 13; ver la alternativa recomendada]

Como alternativa adicional, puede hacer que su aplicación escuche los eventos que provocarían un reinicio, como la orientación y los cambios de visibilidad del teclado, y los manejaría dentro de su Actividad.

Comience agregando el android:configChanges nodo al nodo manifiesto de su actividad

android:configChanges="keyboardHidden|orientation"

o por Android 3.2 (API nivel 13) y más nuevo:

android:configChanges="keyboardHidden|orientation|screenSize"

Luego, dentro de la Actividad, anula onConfigurationChanged método y llamada setContentView para forzar el diseño de la GUI para volver a realizarse en la nueva orientación.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}

896
2018-01-19 08:47



Actualización para Android 3.2 y superior:

Precaución: A partir de Android 3.2 (API nivel 13), el "tamaño de pantalla" también cambia cuando el dispositivo cambia entre orientación vertical y horizontal. Por lo tanto, si desea evitar el reinicio del tiempo de ejecución debido al cambio de orientación cuando se desarrolla para el nivel API 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), debe incluir el "screenSize" valor, además de la "orientation" valor. Es decir, debes declarar android:configChanges="orientation|screenSize". Sin embargo, si su aplicación se dirige al nivel API 12 o inferior, su actividad siempre maneja esta configuración por sí misma (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo con Android 3.2 o superior).


175
2018-03-03 21:56



En lugar de tratar de detener el onCreate() de ser despedido por completo, tal vez intente comprobar el Bundle  savedInstanceState pasando al evento para ver si es nulo o no.

Por ejemplo, si tengo algo de lógica que debería ejecutarse cuando Activity realmente creado, no en cada cambio de orientación, solo ejecuto esa lógica en el onCreate()solo si el savedInstanceState es nulo.

De lo contrario, todavía quiero que el diseño vuelva a dibujarse correctamente para la orientación.

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

no estoy seguro de si esta es la respuesta definitiva, pero funciona para mí.


110
2017-08-04 21:04



lo que hice...

en el manifiesto, a la sección de actividad, agregó:

android:configChanges="keyboardHidden|orientation"

en el código para la actividad, implementado:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}

93
2018-01-04 01:26



Lo que describes es el comportamiento predeterminado. Debe detectar y manejar estos eventos usted mismo al agregar:

android:configChanges

a su manifiesto y luego a los cambios que desea manejar. Entonces, para la orientación, usarías:

android:configChanges="orientation"

y para abrir o cerrar el teclado, usaría:

android:configChanges="keyboardHidden"

Si quiere manejar ambos, puede separarlos con el comando pipe como:

android:configChanges="keyboardHidden|orientation"

Esto activará el método onConfigurationChanged en cualquier actividad que llame. Si anula el método, puede pasar los nuevos valores.

Espero que esto ayude.


57
2018-01-19 02:28



Acabo de descubrir esta historia:

Para mantener viva la Actividad a través de un cambio de orientación, y manejarlo a través de onConfigurationChanged, la documentación y el ejemplo de código anterior sugiéralo en el archivo Manifiesto:

android:configChanges="keyboardHidden|orientation"

que tiene el beneficio adicional de que siempre funciona.

La tradición extra es que omitiendo el keyboardHidden puede parecer lógico, pero causa fallas en el emulador (para Android 2.1 al menos): especificando solo orientation hará que el emulador llame a ambos OnCreate y onConfigurationChanged a veces, y solo OnCreate otros tiempos.

No he visto la falla en un dispositivo, pero he escuchado que el emulador falla para otros. Entonces vale la pena documentar.


39
2017-12-22 21:50



También podría considerar usar la forma de datos persistentes de la plataforma Android en los cambios de orientación: onRetainNonConfigurationInstance() y getLastNonConfigurationInstance().

Esto le permite conservar datos a través de cambios de configuración, como información que puede haber obtenido de una búsqueda del servidor u otra cosa que se haya calculado en onCreate o desde entonces, a la vez que permite que Android vuelva a diseñar su Activity usando el archivo xml para la orientación ahora en uso.

Ver aquí o aquí.

Se debe tener en cuenta que estos métodos ahora están en desuso (aunque aún más flexible que la orientación del manejo, cambie usted mismo como sugieren la mayoría de las soluciones anteriores) con la recomendación de que todos cambien a Fragments y en su lugar use setRetainInstance(true) en cada Fragment quieres retener


33
2017-09-22 03:03