Reinicio de actividad en rotación Android
En mi aplicación de Android, cuando giro el dispositivo (deslizo el teclado hacia afuera), Activity
se reinicia ( onCreate
se llama). Ahora, probablemente así es como se supone que debe ser, pero realizo mucha configuración inicial en el onCreate
método, por lo que necesito:
- Coloque toda la configuración inicial en otra función para que no se pierda por completo en la rotación del dispositivo o
- Haga que
onCreate
no se vuelva a llamar y que el diseño simplemente se ajuste o - Limite la aplicación solo a retrato para que
onCreate
no se llame.
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 Application
y mueva su código de inicialización a un onCreate
mé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 onCreate
clase 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:configChanges
nodo 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 onConfigurationChanged
método y llame setContentView
para 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);
}
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 declararandroid: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
En lugar de intentar evitar que onCreate()
se dispare por completo, tal vez intente verificar que Bundle
savedInstanceState
se haya pasado al evento para ver si es nulo o no.
Por ejemplo, si tengo alguna lógica que debe ejecutarse cuando Activity
realmente se crea, no en cada cambio de orientación, solo ejecuto esa lógica solo onCreate()
si savedInstanceState
es 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í.
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();
}
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.