Reinicio de actividad en rotación Android

Resuelto Isaac Waller asked hace 54 años • 34 respuestas

En mi aplicación de Android, cuando giro el dispositivo (deslizo el teclado hacia afuera), Activityse reinicia ( onCreatese llama). Ahora, probablemente así es como se supone que debe ser, pero realizo mucha configuración inicial en el onCreatemétodo, por lo que necesito:

  1. Coloque toda la configuración inicial en otra función para que no se pierda por completo en la rotación del dispositivo o
  2. Haga que onCreateno se vuelva a llamar y que el diseño simplemente se ajuste o
  3. Limite la aplicación solo a retrato para que onCreateno se llame.
Isaac Waller avatar Jan 01 '70 08:01 Isaac Waller
Aceptado

Usando la clase de aplicación

Dependiendo de lo que esté haciendo en su inicialización, podría considerar crear una nueva clase que extienda Applicationy mueva su código de inicialización a un onCreatemétodo anulado dentro de esa clase.

Versión Kotlin

class MyApplicationClass: Application {
    @override fun onCreate() {
        super.onCreate()
        // Put your application initialization code here
    }
}

versión java

public class MyApplicationClass extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // Put your application initialization code here
    }
}

La onCreateclase de aplicación solo se llama cuando se crea toda la aplicación, por lo que la actividad se reinicia con cambios de orientación o visibilidad del teclado no la activará.

Es una buena práctica exponer la instancia de esta clase como un singleton y exponer las variables de la aplicación que está inicializando usando captadores y definidores.

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

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

Reaccionar a los cambios de configuración

ACTUALIZACIÓN: Esto está en desuso desde API 13; ver la alternativa recomendada

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

Comience agregando el android:configChangesnodo al nodo de manifiesto de su Actividad:

 <activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

O para Android 3.2 (API nivel 13) y posteriores :

<activity android:name=".MyActivity"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:label="@string/app_name">

Luego, dentro de la Actividad, anule el onConfigurationChangedmétodo y llame setContentViewpara forzar que el diseño de la GUI se rehaga en la nueva orientación.

Versión Kotlin

@override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    setContentView(R.layout.myLayout)
}

versión java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.myLayout);
}
Reto Meier avatar Jan 19 '2009 08:01 Reto Meier

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 que se reinicie el tiempo de ejecución debido a un cambio de orientación al desarrollar para el nivel de API 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), debe incluir el "screenSize"valor además del "orientation"valor. Es decir, debes declarar android:configChanges="orientation|screenSize". Sin embargo, si su aplicación tiene como objetivo el nivel API 12 o inferior, entonces su actividad siempre maneja este cambio de configuración por sí misma (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo Android 3.2 o superior).

De http://web.archive.org/web/20120805085007/http://developer.android.com/guide/topics/resources/runtime-changes.html

Gorm avatar Mar 03 '2012 21:03 Gorm

En lugar de intentar evitar que onCreate()se dispare por completo, tal vez intente verificar que Bundle savedInstanceStatese haya pasado al evento para ver si es nulo o no.

Por ejemplo, si tengo alguna lógica que debe ejecutarse cuando Activityrealmente se crea, no en cada cambio de orientación, solo ejecuto esa lógica solo onCreate()si savedInstanceStatees nula.

De lo contrario, todavía quiero que el diseño se vuelva a dibujar 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í.

nebulae avatar Aug 04 '2012 21:08 nebulae

lo que hice...

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

android:configChanges="keyboardHidden|orientation"

en el código de 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();
}
Someone Somewhere avatar Jan 04 '2011 01:01 Someone Somewhere

Lo que usted describe es el comportamiento predeterminado. Debe detectar y manejar estos eventos usted mismo agregando:

android:configChanges

a su manifiesto y luego los cambios que desea manejar. Entonces, para orientarte, usarías:

android:configChanges="orientation"

y para abrir o cerrar el teclado usarías:

android:configChanges="keyboardHidden"

Si desea manejar ambos, puede separarlos con el comando de tubería 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.

GregD avatar Jan 19 '2009 02:01 GregD