Una delle nostre viste ha un ScrollView
come layout di root. Quando il dispositivo viene ruotato e viene chiamato , vorremmo essere in grado di ottenere la nuova larghezza/altezza dello ScrollView
. Il nostro codice è simile al seguente:Come ottenere NUOVA larghezza/altezza del layout di root in onConfigurationChanged?
@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 sezione dedicata del nostro AndroidManifest.xml assomiglia a questo:
<activity android:name=".SomeActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
E, infine, la quota di competenza del nostro layout si presenta così:
<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"
>
Sul nostro Droid, ci aspettavamo di vedere la larghezza della ScrollView andare a 854 quando passa nel paesaggio, e di 480 quando si ritorna al ritratto (e l'altezza fare lo switch equivalente, meno la barra dei menu) . Tuttavia, stiamo vedendo il contrario. Ecco la nostra 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
Chiaramente, stiamo ottenendo le dimensioni ritratto quando si passa al paesaggio, e le dimensioni del paesaggio quando si passa al ritratto. C'è qualcosa che stiamo sbagliando? Potremmo ottenere hacky e risolvere questo problema, ma mi sembra che ci sia una soluzione semplice che ci manca.
Questo è quello che temevamo. La prima soluzione che possiamo pensare è generare un thread, attendere 100ms o qualcosa, e quindi prendere la larghezza/altezza. C'è qualcosa di meno hacky che possiamo fare? – jakeboxer
Generare una discussione? Oh no non farlo! Puoi semplicemente pubblicare un Runnable in un Handler (o sul thread dell'interfaccia utente usando per esempio View.post().) Puoi anche registrare un listener con ViewTreeObserver, attendere un evento di modifica del ridimensionamento in una vista personalizzata, ecc. –
Ascolto al ViewTreeObserver mi sembra la soluzione migliore perché trovo il metodo di attesa un po 'hacky. – jqpubliq