21

ビューの1つには、ScrollViewルートレイアウトとしてがあります。デバイスが回転して呼び出されたときに、の新しい幅/高さonConfigurationChanged()を取得できるようにしたいと思います。ScrollViewコードは次のようになります。

@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() + "'");
}

AndroidManifest.xmlの関連セクションは次のようになります。

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

そして最後に、レイアウトの関連部分は次のようになります。

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

私たちのドロイドでは、ScrollViewの幅が横向きに切り替えられると854になり、縦向きに戻ると480になると予想していました(そして高さはメニューバーを除いた同等の切り替えを行います)。ただし、その逆が見られます。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

明らかに、横向きに切り替えると縦向きの寸法になり、縦向きに切り替えると横向きの寸法になります。私たちが間違っていることはありますか?私たちはハッキーになってこれを解決することができましたが、私たちが欠けている単純な解決策があるように感じます。

4

3 に答える 3

37

より詳細なソリューションの説明をお探しの場合:ViewTreeObserverビューのを使用して、を登録でき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);
        }
    });
}
于 2011-11-23T16:14:08.913 に答える
16

onGlobalLayoutが呼び出されたとき、ビューが新しいレイアウトの向きに応じてサイズ変更されているかどうかわからないため、私にとっては以下のソリューションのみが正しく機能しました。

@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);}
于 2015-05-26T21:24:42.207 に答える
7

getWidth()は、ビューがレイアウトされているときの幅を返します。つまり、画面に描画されるまで待つ必要があります。onConfigurationChanged新しい構成のビューを再描画する前にが呼び出されるため、後で新しい幅を取得できるとは思いません。

于 2010-03-26T16:52:18.957 に答える