2011-05-06 17 views
6

Voy a volver a hacer esta pregunta porque hay mucha información incorrecta que es realmente deprimente. La historia corta es que no quiero que nada cambie o que suceda cuando cambia la orientación del dispositivo. 2 de las "soluciones" más populares dadas a este problema son:Android: la orientación de la pantalla vuelve a cargar la actividad

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

2. Usted podría decirle al sistema que usted quería manejar los cambios de la pantalla especificando android: configChanges = "screenOrientation" en la etiqueta. De esta forma, 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).

NI de esos trabajos. así que déjenme explicar mi problema particular en 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: un entero único en una sola línea. este número es la cantidad de archivos de imagen también almacenados en este servidor, y todas las imágenes se llaman 0.jpg, 1.jpg, 2.jpg etc.

TODO mi código está en el método onCreate de mi actividad (como he dicho, es una aplicación simple).

la aplicación hace lo siguiente cuando se ejecuta:

lee el número del archivo de texto. genera un número aleatorio desde cero hasta el 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 vuelva a suceder. Simplemente no quiero que pase NADA ... excepto que la pantalla debe rotar obviosuly y la imagen debe escalar para ajustarse, lo que hace. pero cada vez que la pantalla gira todo ese código se ejecuta y se selecciona una nueva imagen aleatoria. ¿alguien puede darme una solución simple con el código de trabajo para arreglar esto? aprendo viendo así que si no puedes proporcionar un ejemplo de código, no será de ayuda.

gracias de antemano.

ps ... no estoy buscando una forma diferente de hacer lo que estoy haciendo, ese no es el punto. Estoy buscando arreglar el camino que estoy haciendo actualmente.

+0

Ah, debe estar haciendo algo mal en su código: 'android: configChanges =" screenOrientation "' ES la forma de manejar lo que quiere hacer. Si lo has configurado correctamente, tu 'onCreate' NO se volverá a ejecutar. Si se vuelve a ejecutar, entonces lo ha configurado mal. Ponga su código en el cuerpo de la pregunta y supongo que la respuesta debería ser bastante simple. – Femi

+1

hhmmm ... ¿qué estás diciendo que configuro mal? si lo único que dices que tengo que hacer es agregar esa línea a mi manifiesto, ¿cómo podría estar haciendo eso mal? –

+0

Eso es de lo que no estoy seguro, y por qué le pedí ver su código. Tengo un código de trabajo que no activa 'onCreate()' cada vez que cambias la orientación. – Femi

Respuesta

3

Una pregunta muy similar está aquí: Don't reload application when orientation changes

De todos modos, en primer lugar se debe cambiar el código de onCreate a otro método y se divide por "crear una imagen de carga de números aleatorios y desde la red" y "imagen establecida para ver".

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

Si es así, haga todo. Si no es así, simplemente configure ImageView o lo que sea con el mapa de bits que tenga.

para evitar la destrucción del mapa de bits cuando gira el uso:

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.

+1

sí, esa es MI pregunta. ninguna de las soluciones funciona. la gente sigue publicando esto sin probar el código. un poco ridículo. –

+0

@NeTeInStEiN: esa es la misma pregunta de JJD. – techiServices

+0

Tenga en cuenta que los datos que recupera aquí solo deben utilizarse como una optimización para manejar cambios de configuración. Siempre debe ser capaz de manejar recuperar un puntero nulo, y una actividad aún debe ser capaz de restablecerse a su estado anterior (a través del mecanismo onSaveInstanceState (Bundle) normal) incluso si esta función devuelve null. – techiServices

0

Por ejemplo, agregue al manifiesto:

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

y luego simplemente reemplazar la función por defecto:

@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 se anula esta función deberá repetir el diseño mismo. Esa es la única forma de hacer lo que quieras. El enfoque de Android para arreglar el tamaño de tu pantalla es eliminar toda la actividad y volver a mostrarla con las nuevas dimensiones. Si opta por no hacerlo volar la actividad, entonces TIENE que manejar el cambio de tamaño de la pantalla. No hay otras opciones para eso.

EDITAR: En esta aplicación en particular, tengo una tabla que aparece en vertical y una tabla 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, cambio la vista del contenido de una a la otra. En su caso, es posible que solo pueda invalidate la Vista raíz actual y vea si se volverá a dibujar correctamente.

Es por eso que quieres que la plataforma se encargue de eso, para que no te ocupes de esta porquería. Será mejor que solo use onSaveInstanceState para conservar los datos específicos que necesita y luego marque onCreate para obtener esos datos y luego úselos. Consulte http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges para obtener más información al respecto.

+0

¿está bien y dónde estoy poniendo ese código? en mi actividad antes de crear? –

+0

@Femi Esta es la única respuesta verdadera. He descubierto que lo mejor es forzar una orientación de pantalla y seguir así, especialmente si se trata de una aplicación pesada de art-art. Por eso, la mayoría de los juegos en el mercado fuerzan una orientación y no permiten que cambie. . – SRM

+0

y qué estoy poniendo en las áreas "diseño para paisaje" y "diseño para retrato"? –

10

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

En el nivel API 13 o superior, el tamaño de la pantalla cambia cuando cambia la orientación, por lo que aún se destruye la actividad y se inicia cuando cambia la orientación.

sólo tiene que añadir el atributo "ScreenSize" como lo hice a continuación:

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

Ahora, cuando su cambio de orientación (y cambios de tamaño de la pantalla), la actividad mantiene su estado y onConfigurationChanged() es llamado. Esto mantendrá todo lo que está en la pantalla (es decir, página web en una vista web) cuando los chagnes de orientación.

aprendido de este sitio: http://developer.android.com/guide/topics/manifest/activity-element.html

Además, esto es al parecer una mala práctica así que lea el siguiente enlace sobre el manejo de los cambios de tiempo de ejecución:

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

+0

justo lo que necesitaba :) aplausos – wayzz

+0

¡Hola! Estoy usando diferentes diseños para el modo retrato y paisaje, así que no puedo usar 'android: configChanges', ¿hay alguna otra solución? –

0

lo que funcionó para mí está declarando una de las variables de clase como estáticas. resulta que las variables de clase estáticas se inicializan una vez cuando se carga la aplicación, pero cuando la aplicación se vuelve a cargar, no se volverán a inicializar.

estas variables podrían contener un estado o un objeto que no desea reiniciar. No puedo decir que esto no sea súper elegante, pero probado y trabajado para mí.

Cuestiones relacionadas