Manejo de la pantalla Manejo con gracia Cambio de orientación durante la actividad Inicio

StackOverflow https://stackoverflow.com/questions/2434071

Pregunta

Estoy tratando de encontrar una manera de manejar correctamente la configuración de una actividad donde su orientación se determina a partir de los datos en la intención que la lanzó. Esto es para un juego en el que el usuario puede elegir niveles, algunos de los cuales son una orientación al retrato y algunos son orientación del paisaje. El problema que me enfrento es que setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) No entra en efecto hasta que la actividad está completamente cargada. Este es un problema para mí porque hago algo de carga y procesamiento de imágenes durante el inicio, lo que solo me gustaría tener que hacer una vez.

Actualmente, si el usuario eligió un nivel de paisaje:

  • La actividad comienza a OnCreate (), por defecto al retrato
  • Descubre al analizar su intención de lanzamiento que debería estar en la orientación del paisaje
  • Continúa independientemente de todo el camino a OnResume (), cargando información y realizando otras tareas de configuración
  • En este punto, setRequestorientation se inicia, por lo que la aplicación se ejecuta a través de OnPause () a OnDestroy ()
  • Luego se inicia nuevamente desde OnCreate () y se ejecuta a Onresume () repitiendo la configuración de antes

¿Hay alguna forma de evitar eso y no realizar la carga dos veces? Por ejemplo, idealmente, la actividad sabría antes de que incluso OnCreate se llamara si debería ser un paisaje o retrato dependiendo de alguna propiedad de la intención de lanzamiento, pero a menos que me haya perdido algo que no sea posible. He logrado piratear una forma de evitar repetir la carga revisando un boolean Antes de los pasos de carga que requieren mucho tiempo, pero esa no parece la forma correcta de hacerlo. Imagino que podría anular onSaveInstanceState, pero eso requeriría mucha codificación adicional. ¿Hay alguna forma simple de hacer esto?

¡Gracias!


Solución:

Según la respuesta de Daniel, esto fue en realidad bastante fácil de solucionar. Solo necesitaba hacer algunos pequeños cambios. En mi actividad de 'menú', donde el jugador elegiría qué nivel jugar, solo tenía que agregar un IF/else verificar qué clase sería iniciada por mi intención. Esto se realizó con un simple intento de retrato o paisaje, determinado cuando el jugador seleccionó un nivel A. Luego creé una segunda clase que extiende mi clase 'Gamelogic'; Esta es la clase que contenía la mayor parte del código para el juego en sí, en lugar de los menús, instrucciones, etc.

public class GameLandscape extends GameLogic{
}

Literalmente tan simple y completamente vacío. De esa manera, heredó todo el código de mi actividad anterior, donde ya lo había codificado para manejar las cosas de manera diferente dependiendo de la orientación. Por último, solo tuve que agregar una línea al manifiesto indicando que Gamelandscape siempre se ejecutaría en el paisaje, y Gamelogic siempre se ejecutaría en retrato.

Entonces un problema simple de hecho.

¿Fue útil?

Solución

Puede hacer dos actividades, una para los niveles de retrato, el otro para los niveles de paisaje, y luego establecer la orientación de la actividad en AndroidManifest.xml, utilizando el android:screenOrientation atributo. Ni siquiera tendrá que duplicar el código si usa herencia; Use su actividad actual como actividad base y simplemente cree el paisaje/actividades de retratos como subclases de esa actividad.

Creo que una mejor solución sería la intención de abrir la actividad correcta de estos dos, aunque si debe tener todo enrutado a través del análisis adicional de la intención, podría reenviar todos los niveles a una tercera actividad que no hace más que analizar la intención y Luego reenvíelo a la actividad adecuada.

Otros consejos

También podrías anular onRetainNonConfigurationInstance(). Esto le permite almacenar temporalmente un artículo que puede recuperar llamando getLastNonConfigurationInstance(). De esa manera, puede cargar todas las cosas que necesita y en su onRetainNonConfigurationInstance() Método Puede guardarlo todo en una estructura de datos y devolverlo. El en tu onCreate() Puedes llamar getLastNonConfigurationInstance() Y si eso devuelve la carga nula, cargue todas sus cosas, si devuelve algo, entonces lo tiene todo cargado. Aquí hay un ejemplo rápido:

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        DataStructure myData = (DataStructure)getLastNonConfigurationInstance();
        if(myData == null)
        {
            // Load everything in
        }
        else
        {
            // Unpack myData
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance()
    {
        DataStructure myData = new DataStructure();
        // Put everything in to myData
        return myData;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top