Question

L'un de nos points de vue a une ScrollView que sa mise en page de racine. Lorsque l'appareil est mis en rotation et onConfigurationChanged() est appelé, nous aimerions être en mesure d'obtenir une nouvelle largeur / hauteur du ScrollView. Notre code ressemble à ceci:

@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 section pertinente de notre AndroidManifest.xml ressemble à ceci:

<activity android:name=".SomeActivity"
    android:configChanges="keyboardHidden|orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

Enfin, la partie pertinente de notre mise en page ressemble à ceci:

<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"
        >

Sur notre Droid, nous nous attendions à aller à 854 la largeur de la ScrollView lors de la mise dans le paysage, et à 480 lorsque ramené au portrait (et la hauteur faire le commutateur équivalent, moins la barre de menu). Cependant, nous voyons le contraire. Voici notre 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

Il est clair que nous obtenons les dimensions de portrait quand on passe en mode paysage, et les dimensions du paysage quand on passe en mode portrait. Y at-il quelque chose que nous faisons mal? Nous pourrions aki et résoudre ce problème, mais je me sens comme il y a une solution simple qui nous manque.

Était-ce utile?

La solution

getWidth () retourne la largeur que la vue est aménagé, ce qui signifie que vous devez attendre jusqu'à ce qu'il soit dessiné à l'écran. onConfigurationChanged est appelée avant de redessiner la vue de la nouvelle configuration et donc je ne pense pas que vous serez en mesure d'obtenir votre nouvelle largeur plus tard.

Autres conseils

Pour ceux qui recherchent une description plus détaillée de la solution. Vous pouvez utiliser le ViewTreeObserver de votre point de vue et enregistrer 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);
        }
    });
}

Quand onGlobalLayout appelé ce n'est pas sûr que la vue a été redimensionnée en conséquence à la nouvelle orientation de mise en page, donc pour moi que la solution ci-dessous a fonctionné correctement:

@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);}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top