En mi aplicación de Android, cuando giro el dispositivo (deslizo el teclado), Activity
se reinicia mi ( onCreate
se llama). Ahora, probablemente así es como se supone que debe ser, pero realizo muchas configuraciones iniciales en el onCreate
método, por lo que necesito:
- Ponga toda la configuración inicial en otra función para que no todo se pierda en la rotación del dispositivo o
- Haga que
onCreate
no se vuelva a llamar y el diseño simplemente se ajuste o - Limite la aplicación a solo retrato para que
onCreate
no se llame.
android
rotation
android-activity
Isaac Waller
fuente
fuente
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 mover su código de inicialización a unonCreate
método anulado dentro de esa clase.La
onCreate
clase en la aplicación solo se llama cuando se crea la aplicación completa, por lo que la actividad se reinicia en la orientación o los cambios de visibilidad del teclado no lo activarán.Es una buena práctica exponer la instancia de esta clase como un singleton y exponer las variables de aplicación que está inicializando usando getters y setters.
NOTA: Deberá especificar el nombre de su nueva clase de Aplicación en el manifiesto para que se registre y se use:
Reacción 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 causarían un reinicio, como cambios de orientación y visibilidad del teclado, y manejarlos dentro de su Actividad.
Comience agregando el
android:configChanges
nodo al nodo manifiesto de su Actividado para Android 3.2 (API nivel 13) y más reciente :
Luego, dentro de la Actividad, anule el
onConfigurationChanged
método y llamesetContentView
para forzar que el diseño de la GUI se vuelva a hacer en la nueva orientación.fuente
android:configChanges
) debe evitarse y usarse solo como último recurso. Lea Manejo de cambios en tiempo de ejecución para obtener más información sobre cómo manejar correctamente un reinicio debido a un cambio de configuración. En lugar de eso, para persistir los datos en los eventos de rotación, parecen preferir usar elonSaveInstanceState Bundle
; o como @ Jon-O menciona ,onRetainNonConfigurationInstance
.onRetainNonConfigurationChanges
es más tolerante a fallas y directa.Actualización para Android 3.2 y superior:
fuente
Fragments
y en susetRetainInstance
lugar.screenSize
para Android 3.2 y superior, eso resolvió mi problema, ¡Gracias!En lugar de tratar de evitar que
onCreate()
se dispare por completo, tal vez intente verificar siBundle
savedInstanceState
se pasa al evento para ver si es nulo o no.Por ejemplo, si tengo alguna lógica que debería ejecutarse cuando
Activity
realmente se crea, no en cada cambio de orientación, solo ejecuto esa lógicaonCreate()
solo sisavedInstanceState
es nula.De lo contrario, todavía quiero que el diseño se vuelva a dibujar correctamente para la orientación.
No estoy seguro si esta es la respuesta definitiva, pero funciona para mí.
fuente
Intent serverintent = new Intent(MainActivity.this, MessageListener.class);
y pudestartService(serverintent);
crear unserverSocket = new ServerSocket(0xcff2);
ySocket client = serverSocket.accept();
con aBufferedReader(new InputStreamReader(client.getInputStream()));
y pude rotar mi Android y mantener activa la conexión cliente / servidor, pero hice girar la GUI. De acuerdo con el manual, savedInstanceState se inicializa cuando se cierra la última actividad.lo que hice...
en el manifiesto, a la sección de actividad, agregó:
en el código de la actividad, implementado:
fuente
Lo que describe es el comportamiento predeterminado. Debe detectar y manejar estos eventos usted mismo agregando:
a su manifiesto y luego los cambios que desea manejar. Entonces, para la orientación, usaría:
y para que el teclado se abra o cierre, usaría:
Si desea manejar ambos, puede separarlos con el comando de tubería como:
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.
fuente
Acabo de descubrir esta historia:
Para mantener viva la Actividad a través de un cambio de orientación y manejarla
onConfigurationChanged
, la documentación y el ejemplo de código anterior sugieren esto en el archivo de Manifiesto:que tiene el beneficio adicional de que siempre funciona.
El conocimiento adicional es que omitir el
keyboardHidden
puede parecer lógico, pero causa fallas en el emulador (al menos para Android 2.1): especificar soloorientation
hará que el emulador llame a ambasOnCreate
yonConfigurationChanged
, a veces, y soloOnCreate
otras veces.No he visto la falla en un dispositivo, pero he escuchado que el emulador falla para otros. Entonces vale la pena documentarlo.
fuente
Fragments
y en susetRetainInstance
lugar.También puede considerar usar la forma en que la plataforma Android mantiene los datos en los cambios de orientación:
onRetainNonConfigurationInstance()
ygetLastNonConfigurationInstance()
.Esto le permite conservar los datos a través de los cambios de configuración, como la información que puede haber obtenido de una búsqueda del servidor o algo más que se ha calculado en
onCreate
o desde entonces, al tiempo que permite que Android rediseñe suActivity
uso del archivo xml para la orientación que está ahora en uso .Mira aquí o aquí .
Cabe señalar 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 sugiere la mayoría de las soluciones anteriores) con la recomendación de que todos cambien
Fragments
y usensetRetainInstance(true)
en cada unoFragment
que quieran conservar.fuente
El enfoque es útil pero está incompleto cuando se usan Fragmentos.
Los fragmentos generalmente se recrean en el cambio de configuración. Si no desea que esto suceda, use
setRetainInstance(true);
en los constructores del FragmentoEsto hará que se retengan fragmentos durante el cambio de configuración.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
fuente
setRetainInstance()
método mencionado por @Abdo.Simplemente agregué
en el archivo de manifiesto y no agregué ningún
onConfigurationChanged
método en mi actividad.Entonces, cada vez que el teclado se desliza hacia afuera o no sucede nada .
fuente
<application ...android:configChanges="keyboard|keyboardHidden|orientation">
y está funcionando. Mi configuración en build.gradle:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
El
onCreate
método todavía se llama incluso cuando cambias elorientation
de android. Por lo tanto, mover todas las funciones pesadas a este método no te ayudaráfuente
Ponga el siguiente código dentro de su
<activity>
etiqueta enManifest.xml
:fuente
¿Qué parte del manifiesto le dice "no llamar
onCreate()
"?También, documentos de Google dicen a evitar el uso
android:configChanges
(excepto como último recurso) .... Pero entonces los métodos alternativos que sugieren todo DO usoandroid:configChanges
.Según mi experiencia, el emulador SIEMPRE llama
onCreate()
al girar.Pero los dispositivos 1-2 en los que ejecuto el mismo código ... no lo hacen. (No estoy seguro de por qué habría alguna diferencia).
fuente
Es muy simple solo siga los siguientes pasos:
Esto funciona para mi:
Nota: la orientación depende de su requerimiento
fuente
Los cambios a realizar en el manifiesto de Android son:
Las adiciones a realizar dentro de la actividad son:
fuente
Agregue esta línea a su manifiesto: -
y este fragmento de la actividad: -
fuente
Hay varias formas de hacerlo:
Guardar estado de actividad
Puede guardar el estado de la actividad en
onSaveInstanceState
.y luego use
bundle
para restaurar el estado.Maneja los cambios de orientación por ti mismo
Otra alternativa es manejar los cambios de orientación usted mismo. Pero esto no se considera una buena práctica.
Agregue esto a su archivo de manifiesto.
para Android 3.2 y posterior:
Restringir rotación
También puede limitar su actividad al modo vertical u horizontal para evitar la rotación.
Agregue esto a la etiqueta de actividad en su archivo de manifiesto:
O implemente esto programáticamente en su actividad:
fuente
La forma en que he encontrado para hacer esto es usar el
onRestoreInstanceState
y losonSaveInstanceState
eventos para guardar algo en elBundle
(incluso si no necesita guardar ninguna variable, simplemente coloque algo allí paraBundle
que no esté vacío). Luego, en elonCreate
método, verifique siBundle
está vacío, y si lo está, haga la inicialización, si no, hágalo.fuente
A pesar de que no es "la forma de Android", he obtenido muy buenos resultados manejando los cambios de orientación y simplemente reposicionando los widgets dentro de una vista para tener en cuenta la orientación alterada. Esto es más rápido que cualquier otro enfoque, ya que sus vistas no tienen que guardarse ni restaurarse. También proporciona una experiencia más fluida para el usuario, porque los widgets reposicionados son exactamente los mismos, simplemente movidos y / o redimensionados. No solo el estado del modelo, sino también el estado de vista, se pueden conservar de esta manera.
RelativeLayout
A veces puede ser una buena opción para una vista que tiene que reorientarse de vez en cuando. Simplemente proporcione un conjunto de parámetros de diseño de retrato y un conjunto de parámetros de diseño de paisaje, con diferentes reglas de posicionamiento relativo en cada uno, para cada widget secundario. Luego, en suonConfigurationChanged()
método, pasa el apropiado a unasetLayoutParams()
llamada de cada niño. Si algún control secundario en sí mismo necesita ser reorientado internamente , simplemente llame a un método en ese elemento secundario para realizar la reorientación. Ese niño llama de manera similar a los métodos en cualquiera de sus controles secundarios que necesitan una reorientación interna, y así sucesivamente.fuente
Cada vez que se gira la pantalla, la actividad abierta finaliza y se vuelve a llamar a onCreate ().
1) Puede hacer una cosa, guardar el estado de la actividad cuando se gira la pantalla para que pueda recuperar todas las cosas viejas cuando se vuelve a llamar a onCreate () de la actividad. Consulte este enlace
2) Si desea evitar el reinicio de la actividad, simplemente coloque las siguientes líneas en su archivo manifest.xml.
fuente
debe usar el método onSavedInstanceState para almacenar todo el valor de su parámetro is has que es bundle
y use
para recuperar y establecer el valor para ver objetos, manejará las rotaciones de la pantalla
fuente
Nota: publico esta respuesta si alguien en el futuro enfrenta el mismo problema que yo. Para mí, la siguiente línea no fue suficiente:
Cuando roté la pantalla, no se llamó al método `onConfigurationChanged (Configuration newConfig).
Solución: también tuve que agregar "screenSize" incluso si el problema tenía que ver con la orientación. Entonces, en el archivo AndroidManifest.xml, agregue esto:
Luego implemente el método
onConfigurationChanged(Configuration newConfig)
fuente
En la sección de actividades del
manifest
, agregue:fuente
Agregue esta línea en manifiesto:
android:configChanges="orientation|screenSize"
fuente
La gente dice que deberías usar
Pero la mejor y más profesional forma de manejar la rotación en Android es usar la clase Loader. No es una clase famosa (no sé por qué), pero es mucho mejor que AsyncTask. Para obtener más información, puede leer los tutoriales de Android que se encuentran en los cursos de Android de Udacity.
Por supuesto, como otra forma, puede almacenar los valores o las vistas con onSaveInstanceState y leerlos con onRestoreInstanceState. Depende de ti realmente.
fuente
Después de un tiempo de prueba y error, encontré una solución que se adapta a mis necesidades en la mayoría de las situaciones. Aquí está el código:
Configuración manifiesta:
Actividad principal:
Y muestra Fragmento:
Se puede encontrar en github .
fuente
Use el
orientation
oyente para realizar diferentes tareas en diferentes orientaciones.fuente
Poner este código en su continuación
Activity
enAndroid Manifest
.Esto no reiniciará su actividad cuando cambie la orientación.
fuente
Fijar la orientación de la pantalla (horizontal o vertical) en
AndroidManifest.xml
android:screenOrientation="portrait"
oandroid:screenOrientation="landscape"
para esto
onResume()
no se llama su método.fuente
Uno de los mejores componentes del android architechure introducido por google cumplirá con todos los requisitos que tiene ViewModel.
Está diseñado para almacenar y administrar datos relacionados con la interfaz de usuario en el ciclo de vida, además de que permitirá que los datos sobrevivan a medida que la pantalla gira
Consulte esto: https://developer.android.com/topic/libraries/architecture/viewmodel
fuente
Puede usar el objeto ViewModel en su actividad.
Los objetos ViewModel se retienen automáticamente durante los cambios de configuración para que los datos que contienen estén disponibles de inmediato para la siguiente actividad o instancia de fragmento. Lee mas:
https://developer.android.com/topic/libraries/architecture/viewmodel
fuente