我们的一个视图以 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
很明显,当我们从竖屏切换到横屏时,我们得到的是纵向尺寸,而当我们从横屏切换到竖屏时,我们得到的是横向尺寸。我们做错了什么吗?我们可以使用hacky方法解决这个问题,但我觉得我们可能忽略了一个简单的解决方案。
onGlobalLayout
方法的无限循环调用,在根据视图新尺寸进行计算后,我必须移除监听器:view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
- Sébastien