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();
}
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
@ 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) –
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