Android, ¿cómo no destruir la actividad cuando giro el dispositivo?

81

Tengo una aplicación que funciona solo en modo vertical, y he realizado los cambios en mi archivo de manifiesto para cada actividad, la orientación debe ser vertical. Pero cuando giro el dispositivo, la actividad se recrea nuevamente. ¿Cómo no destruir la actividad?

Vasil
fuente
1
Esto a menudo se desaconseja, puede intentar configurar la orientación de sus aplicaciones mediante programación con algo como: setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
stealthcopter
7
¿Por qué estaría en contra? Digamos que tenemos un servicio que tarda 2 segundos en ejecutarse. Si la actividad se destruye cada vez, ese servicio sigue ejecutándose cada vez que yo solo necesito que se ejecute una vez.
Mohamed Mansour

Respuestas:

131

Para API 12 e inferior : agregue

android:configChanges="orientation"

Agregue "screenSize" si está apuntando a API 13 o superior porque siempre que cambia su orientación, también lo hace el tamaño de su pantalla; de lo contrario, los nuevos dispositivos continuarán destruyendo su actividad. Consulte la respuesta de Egg a continuación para obtener más información sobre el uso de "screenSize"

android:configChanges="orientation|screenSize"

a su actividad en AndroidManifest.xml. De esta forma, su actividad no se reiniciará automáticamente. Consulte la documentación para obtener más información.

Desafío aceptado
fuente
La actividad se reinicia nuevamente. No sé cuál es el punto de hacer todo lo que hay que hacer cuando la actividad gira, incluso si no gira virtualmente. ¿Hay alguna forma de deshabilitar esos mensajes que el sensor envía al sistema operativo sobre la rotación, o algo así, para solucionar este problema desde su raíz?
Vasil
6
en que dispositivo estas programando? recuerde que, por ejemplo, deslizar el teclado también podría reiniciar su actividad ... (si esa es la razón, configure confChanges en "keyboard | keyboardHidden | Orientación")
2
Esto deshabilita el cambio de diseño. ¿Cómo arreglo eso?
Remian8985
1
Esta solución resuelve la actividad de destrucción y creación, pero cómo manejar los cambios de diseño. Quiero decir cuando cambia la orientación, carga el diseño correspondiente.
sandeepmaaram
¿Hay alguna manera de configurar el parámetro android: configChanges mediante programación, en lugar de en el archivo de manifiesto?
CodyF
108

Del documento oficial, flurin dijo:

Nota: Si su aplicación tiene como objetivo el nivel de API 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), también debe declarar la configuración "screenSize", porque también cambia cuando un dispositivo cambia entre las orientaciones vertical y horizontal.

Entonces, si su aplicación tiene como objetivo el nivel de API 13 o superior, debe establecer esta configuración en su lugar:

android:configChanges="orientation|screenSize"

huevo
fuente
4
Muchas gracias! Todas las demás respuestas pierden esta parte en la que el nivel de API 13 presenta esta cosa de screenSize. ¡Me acabas de salvar la vida! :)
Tamás Barta
1
@egg ¡Gracias uuuuuu! :) ¡Esto ayudó!
KarenAnne
1
Buen consejo: es difícil mantenerse al día con la documentación cuando lo hace a tiempo parcial.
wallerjake
1
+1 Hombre de buen toque. Gracias por compartir esta solución con nosotros. Salvaste mi día. Gracias;)
Simon Dorociak
9

La solucion correcta es

android:configChanges="orientation|screenSize"

Documentación de Android:

El tamaño de pantalla disponible actual ha cambiado. Esto representa un cambio en el tamaño disponible actualmente, en relación con la relación de aspecto actual, por lo que cambiará cuando el usuario cambie entre horizontal y vertical. Sin embargo, si su aplicación tiene como objetivo el nivel de 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). *

er_benji
fuente
5

Estuve arruinando esto un poco y luego me di cuenta de que dentro del archivo Manifest estaba colocando configChanges en el nivel de Aplicación y no en el Nivel de Actividad. Así es como se ve el código cuando funciona correctamente para mí.

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application> 
superheron
fuente
2
Debes compartir el código dentro de tu publicación en lugar de una imagen.
Jules Dupont
Por favor editar tu post y mostrar el código de manifiesto real como texto en lugar de imágenes. Otros no pueden copiar y pegar sus imágenes. Consulte aquí para obtener más detalles. Gracias.
Pang
1

Ahora que Android es compatible con la pantalla dividida ("ventana múltiple" en el lenguaje de Android), probablemente también desee agregar screenSize | smallestScreenSize | screenLayout | orientación. Entonces, para manejar la rotación y la pantalla dividida, querrá algo como esto en Android: configChanges

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>
pkoepke
fuente
-1

escribir en manifiesto:

android:configChanges="orientation|screenSize|keyboardHidden"

y anule esto en la actividad que resolvió su problema:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
}
mojtaba
fuente
5
¿Por qué anular el método onConfigurationChanged y llamar a la implementación original haría algo útil?
ricosrealm