Android: la orientación de la pantalla vuelve a cargar la actividad

Voy a volver a hacer esta pregunta porque hay tanta información mala por ahí es realmente deprimente. La historia corta es que no quiero que nada cambie o suceda cuando cambia la orientación del dispositivo. 2 de los "solutuions" más populares dados a este problema son:

1.Puede bloquear la actividad en una orientación añadiendo android: screenOrientation = "portrait" (o "landscape") en su manifiesto.

2. Usted podría decirle al sistema que usted significó manejar cambios de la pantalla para sí mismo especificando android: configChanges = "screenOrientation" en la etiqueta. De esta manera, la actividad no se recreará, sino que recibirá una devolución de llamada en su lugar (que puede ignorar, ya que no es útil para usted).

Ninguno de esos trabajos. Así que permítanme explicar mi problema particular con más detalle …

Estoy experimentando con una aplicación muy simple como un ejercicio de aprendizaje. Tengo un archivo de texto en un servidor. El archivo de texto tiene 1 cosa en él: un solo entero en una sola línea. Este número es el número de archivos de la imagen también almacenados en este servidor, y las imágenes se llaman todos 0.jpg, 1.jpg, 2.jpg etc.

TODO mi código está en el método onCreate de mi actividad (como dije que es una aplicación sencilla).

La aplicación hace lo siguiente cuando se ejecuta:

Lee el número del archivo de texto. Generar un número aleatorio de cero al número en el archivo. Carga una imagen aleatoria en una vista de imagen utilizando el número aleatorio en la URL.

Cuando la pantalla gira no quiero que todo eso vuelva a suceder. Simplemente no quiero que NADA suceda … excepto que la pantalla debe obviosuly rotar y la imagen debe escalar para caber, lo que hace. Pero cada vez que gira la pantalla todo ese código se ejecuta y se selecciona una nueva imagen aleatoria. ¿Puede alguien por favor darme una solución simple con el código de trabajo para arreglar esto? Aprendo viendo tan si usted no puede proporcionar un ejemplo de código que no ayudará.

gracias por adelantado.

Ps … no estoy buscando una forma diferente de hacer lo que estoy haciendo, eso no es el punto. Im buscando a arreglar la forma en que estoy haciendo actualmente.

Una pregunta muy similar está aquí: No vuelva a cargar la aplicación cuando los cambios de orientación

De todos modos, primero debes cambiar el código de onCreate a otro método y dividirlo por "crear un número aleatorio y cargar la imagen de la red" y "configurar la imagen para ver".

Tiene un Bitmap en la actividad, que verifica si es nulo cada vez que se inicia la actividad.

Si es así, hazlo todo. Si no es así, sólo tiene que establecer el ImageView o lo que sea con el mapa de bits que tiene.

Para evitar destruir el mapa de bits cuando gira, utilice:

  Bitmap image = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); image = (Bitmap) getLastNonConfigurationInstance(); if(bitmap == null){ image = downloadImage(); } setImage(bitmap); } @Override public Object onRetainNonConfigurationInstance() { return bitmap; } 

Esto funciona, estoy 100% seguro.

La solución que utiliza android:configChanges="orientation" no funcionará a menos que la aplicación tenga un nivel de API de 12 o inferior.

En API de nivel 13 o superior, el tamaño de la pantalla cambia cuando la orientación cambia, por lo que esto todavía provoca que la actividad se destruya y se inicie cuando cambie la orientación.

Simplemente agregue el atributo "screenSize" como lo hice a continuación:

 <activity> android:name=".YourActivityName" android:configChanges="orientation|screenSize"> </activity> 

Ahora, cuando cambia la orientación del cambio (y cambia el tamaño de la pantalla), la actividad mantiene su estado y se llama onConfigurationChanged (). Esto mantendrá lo que esté en la pantalla (es decir: página web en una vista Web) cuando los chagnes de orientación.

Aprendí esto desde este sitio: http://developer.android.com/guide/topics/manifest/activity-element.html

Además, esto es aparentemente una mala práctica, así que lee el siguiente enlace sobre cómo manejar los cambios en tiempo de ejecución:

http://developer.android.com/guide/topics/resources/runtime-changes.html

Por ejemplo, agregue al manifiesto:

 <activity android:name=".Explorer" android:label="@string/app_name" android:configChanges="orientation" android:launchMode="standard"> </activity> 

Y luego simplemente anular la función predeterminada:

  @Override public void onConfigurationChanged(Configuration _newConfig){ super.onConfigurationChanged(_newConfig); int height = getWindowManager().getDefaultDisplay().getHeight(); int width = getWindowManager().getDefaultDisplay().getWidth(); if(width > height){ // layout for landscape }else{ // layout for portrait } } 

NOTA: si anula esta función USTED debe volver a hacer el diseño usted mismo. Esa es la única manera de hacer lo que quieres. El enfoque de Android para arreglar el tamaño de la pantalla es volar toda la Actividad y llevarla de nuevo con las nuevas dimensiones. Si opta por no tener que soplar la actividad de distancia, entonces usted tiene que manejar el cambio de tamaño de la pantalla. No hay otras opciones para eso.

EDIT: En esta aplicación en particular, tengo una tabla que aparece en el retrato, y un gráfico que aparece en el paisaje. Así que hago esto:

 void showDataView() { setContentView(mainView); currentView = mainView; } void showGraphView() { if(currentView == mainView){ if(graphView == null){ setContentView(R.layout.graphview); graphView = (GraphView)findViewById(R.id.graphview); } setContentView(graphView); currentView = graphView; graphView.setDataToPlot(DATA_TO_PLOT); graphView.clear(); } } @Override public void onConfigurationChanged(Configuration _newConfig){ super.onConfigurationChanged(_newConfig); int height = getWindowManager().getDefaultDisplay().getHeight(); int width = getWindowManager().getDefaultDisplay().getWidth(); if(width > height){ showGraphView(); }else{ showDataView(); } if(graphView != null) graphView.setGraphWidth(width); } 

Cada vez que cambia la orientación, cambie la vista de contenido de uno a otro. En su caso, podría ser capaz de invalidate la vista raíz actual y ver si se volverá a dibujar correctamente.

Esta es la razón por la que desea que la plataforma se encargue de ello, por lo que no se ocupan de esta mierda. Usted estaría mejor sólo usando onSaveInstanceState para conservar los datos específicos que necesita y, a continuación, comprobar en onCreate para que los datos y luego usarlo. Consulte http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges para obtener información sobre eso.

Lo que funcionó para mí es declarar una de las variables de clase como estática. Resulta que las variables de clase estática se inicializan una vez cuando se está cargando la aplicación, pero cuando se está cargando la aplicación, éstas no se volverán a inicializar.

Estas variables podrían contener un estado o un objeto que no desea reinicializar. No puedo decir que esto no es super elegante, pero probado y trabajado para mí.

Guarde los detalles de la imagen en su onPause() o onStop() y onCreate(Bundle savedInstanceState) en el onCreate(Bundle savedInstanceState) para restaurar la imagen.

Más información sobre el proceso real se detalla aquí http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle, ya que es diferente en Honeycomb que las versiones anteriores de Android.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.