Cómo obtener NUEVA anchura / altura del diseño raíz en onConfigurationChanged?
Una de nuestras vistas tiene un ScrollView
como su diseño raíz. Cuando se hace girar el dispositivo y se llama onConfigurationChanged()
, nos gustaría poder obtener la nueva anchura / altura del ScrollView
. Nuestro código se ve así:
@Override public void onConfigurationChanged(Configuration newConfig) { Log.d(TAG, "Width: '" + findViewById(R.id.scrollview).getWidth() + "'"); Log.d(TAG, "Height: '" + findViewById(R.id.scrollview).getHeight() + "'"); super.onConfigurationChanged(newConfig); Log.d(TAG, "Width: '" + findViewById(R.id.scrollview).getWidth() + "'"); Log.d(TAG, "Height: '" + findViewById(R.id.scrollview).getHeight() + "'"); }
La sección correspondiente de nuestro AndroidManifest.xml se ve así:
- Espacio en blanco se agrega al final cuando pongo Webview dentro de scrollview en android
- No se puede obtener ScrollView para desplazarse cuando se muestra el teclado virtual
- Problema con webview y scrollview
- ¿Cómo puedo obtener una función de paginación en vista de desplazamiento horizontal sin ViewPager?
- ListView dentro de ScrollView no se desplaza en Android
<activity android:name=".SomeActivity" android:configChanges="keyboardHidden|orientation"> <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity>
Y, por último, la parte relevante de nuestro diseño se ve así:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scrollview" android:layout_height="fill_parent" android:layout_width="fill_parent" > <LinearLayout android:id="@+id/container" android:orientation="vertical" android:layout_height="fill_parent" android:minHeight="200dip" android:layout_width="fill_parent" >
En nuestro Droid, esperábamos que el ancho de ScrollView pasara a 854 cuando se cambiara al paisaje ya 480 cuando cambiara de nuevo a vertical (y la altura haga el cambio equivalente, menos la barra de menús). Sin embargo, estamos viendo lo contrario. Aquí está nuestro LogCat:
// Switching to landscape: 03-26 11:26:16.490: DEBUG/ourtag(17245): Width: '480' // Before super 03-26 11:26:16.490: DEBUG/ourtag(17245): Height: '778' // Before super 03-26 11:26:16.529: DEBUG/ourtag(17245): Width: '480' // After super 03-26 11:26:16.536: DEBUG/ourtag(17245): Height: '778' // After super // Switching to portrait: 03-26 11:26:28.724: DEBUG/ourtag(17245): Width: '854' // Before super 03-26 11:26:28.740: DEBUG/ourtag(17245): Height: '404' // Before super 03-26 11:26:28.740: DEBUG/ourtag(17245): Width: '854' // After super 03-26 11:26:28.740: DEBUG/ourtag(17245): Height: '404' // After super
Claramente, estamos obteniendo las dimensiones de retrato cuando cambiamos a paisaje y las dimensiones de paisaje cuando cambiamos a retrato. ¿Hay algo que estamos haciendo mal? Podríamos obtener hacky y resolver esto, pero siento que hay una solución simple que nos falta.
- Ajusta scrollview cuando el teclado está hacia arriba
- Android: cómo hacer scrollview infinito con desplazamiento sin fin
- Las filas ListView de Android en ScrollView no se muestran completamente - recortadas
- ¿Cómo puedo hacer que mi cuadro de diálogo de Android sea de pantalla completa?
- Relativelayout dentro Scrollview no funciona
- No se puede cambiar el tamaño de RelativeLayout dentro de ScrollView para llenar toda la pantalla
- Cómo puedo crear un diseño nestedScroll como este?
- Habilitar scroll intertial en NestedScrollView (Android Studio)
GetWidth () devuelve el ancho como la vista se establece, lo que significa que debe esperar hasta que se dibuja a la pantalla. onConfigurationChanged
se llama antes de volver a dibujar la vista para la nueva configuración y así no creo que pueda obtener su nuevo ancho hasta más tarde.
Para aquellos que buscan una descripción de la solución más detallada: Puede utilizar el ViewTreeObserver
de su vista y registrar un OnGlobalLayoutListener
.
@Override public void onConfigurationChanged(Configuration newConfiguration) { super.onConfigurationChanged(newConfiguration); final View view = findViewById(R.id.scrollview); ViewTreeObserver observer = view.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Log.v(TAG, String.format("new width=%d; new height=%d", view.getWidth(), view.getHeight())); view.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); }
Cuando onGlobalLayout llamó no está seguro de que la vista se ha cambiado de tamaño de acuerdo con la nueva orientación de diseño, por lo que para mí sólo la siguiente solución funcionó correctamente:
@Override public void onConfigurationChanged(Configuration newConfig) { final int oldHeight = mView.getHeight(); final int oldWidth = mView.getWidth(); mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (mView.getHeight() != oldHeight && mView.getWidth() != oldWidth) { mView.getViewTreeObserver().removeOnGlobalLayoutListener(this); //mView now has the correct dimensions, continue with your stuff } } }); super.onConfigurationChanged(newConfig);}
- Android, captura de url de redirección webview
- Cómo quitar un contacto mediante programación en android