2011-04-15 8 views
9

Me gustaría que mi diseño VIEW se ajuste en el cambio de orientación.El diseño de vista no se actualiza en el cambio de orientación en android

Mi manifiesto está configurado con: android:configChanges="keyboardHidden|orientation" en la actividad.

Tengo res/layout-land, res/layout-port.

Tengo onConfigurationChanged en mi Activity (se llama a la rotación).

En mi Activity tengo ViewFlipper y en su interior tengo LinearLayouts.

Cuando INICIO el Activity en modo puerto o tierra, el diseño de la vista es correcto (según a mis archivos res/layout-????).

Pero cuando ya estoy en el Activity y giro el teléfono, mi diseño de vista no cambia. La pantalla se gira y no se llama al onCreate de la actividad, como se supone que es, se llama al onConfigurationChanged en el Activity, pero la pantalla siempre se vuelve a dibujar con el LinearLayout que se inició cuando se inició Activity.

Tengo la sensación de que me pierdo algo en el onConfigurationChanged, pero no sé qué. Creo que necesito llamar a alguna función en el ViewFlipper o en el LinearLayout que está adentro. ¿Qué funciones debo llamar?

ViewFlipper flipper; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    flipper = new ViewFlipper(getApplicationContext()); 
    setContentView(flipper); 
    initLayout(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(flipper); 
} 

void initLayout() { 
    MyView myview = createMyView(0); 
    flipper.addView(myview, 0); 
    myview = createMyView(1); 
    flipper.addView(myview, 1); 
    myview = createMyView(1); 
    flipper.addView(myview, 1); 
} 

He intentado añadir a flipper = new ViewFlipper(getApplicationContext()); sino que hizo todo lo negro después de la rotación. Creo que tendré que llamar a initLayout, pero eso lo recalculará todo (y eso es exactamente lo que no quiero hacer, y es por eso que trato de hacerlo con onConfigurationChanged, a diferencia del predeterminado de Android "dropMyActivity & createANewActivity"

SOLUCIÓN: Anteriormente pensé que pueden desencadenar la disposición que se actualice en la rotación, pero parece que tengo que volver a crear el diseño con el contexto actual (después del cambio de orientación)

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.category_flipper); 
    ViewFlipper oldFlipper = viewFlipper; 
    viewFlipper = (ViewFlipper)findViewById(R.id.categoryFlipper); 
    for (int i = 0; i < 3; i++) { 
     final CardLayout cl = new CardLayout(this, cardData[i]); 
     viewFlipper.addView(cl); 
    } 
    cardData[viewIndex].restorePlayer(); 
    viewFlipper.setDisplayedChild(viewIndex); 
    oldFlipper.removeAllViews(); 
} 

Respuesta

8

Si flipper es una referencia a la vista que se instala por primera vez, eso es lo que está causando el problema. Debe pasar el Id. De recurso del diseño que desea, no la vista antigua antes de rotar el teléfono. La vista de contenido se vinculará al nuevo recurso. Tal vez algo como esto (modulo mi conjetura en sus identificadores de recursos):

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.flipper); 
    flipper = (ViewFlipper) findViewById(R.id.flipper); 
} 
+0

Ok, esto parece ser la buena dirección, pero todavía tienen que encontrar la manera de encajar a mi caso voy a añadir algo más de código a la pregunta original – Gavriel

+1

@ Flöcsy - Estoy buscando initLayout, que contiene el trabajo que dices que no quieres repetir, pero parece que está creando todas las vistas nuevamente. Esto es exactamente lo que necesita hacer para restablecer la pantalla cuando se gira la pantalla.Si realiza cálculos costosos al mismo tiempo que crea las vistas, y estas realmente son independientes de la configuración, puede capturarlas y reutilizarlas tal como se describe [aquí] (http://developer.android.com/resources/articles /faster-screen-orientation-change.html) –

+0

Ted, creo que tienes razón. Aunque createMyView es el trabajo caro, pero ahora entiendo la idea, y probablemente estoy haciendo mucho más de lo que se supone que debo hacer (por ejemplo, estoy analizando un archivo zip para encontrar imágenes (para mostrarlas en un ImageButton) y archivos mp3 (para reproducir cuando se reproduce el botón). – Gavriel

0

poner eso en su manifiesto de Android. Android: configChanges = "orientation"

en ese caso sólo tratar esto y configurar su diseño ...

if (Intraday.this.getResources(). getConfiguration(). orientation == Configuration.ORIENTATION_PORTRAIT){ 


    } 
    else if (Intraday.this.getResources(). getConfiguration(). orientation == Configuration.ORIENTATION_LANDSCAPE) {  


    } 
Cuestiones relacionadas