如何在onConfigurationChanged中获取根布局的新宽度/高度?

我们的一个视图将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的相关部分如下所示:

      

最后,我们布局的相关部分如下所示:

   

在我们的Droid上,我们期望看到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并解决这个问题,但我觉得我们缺少一个简单的解决方案。

Related of "如何在onConfigurationChanged中获取根布局的新宽度/高度?"

getWidth()在View布局时返回宽度,这意味着您需要等到它被绘制到屏幕上。 在重新绘制新配置的视图之前调用onConfigurationChanged ,因此我认为您不能在以后获得新的宽度。

对于那些寻找更详细的解决方案描述的人:您可以使用视图的OnGlobalLayoutListener并注册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); } }); } 

当onGlobalLayout调用它时,不确定视图是否已根据新的布局方向resize,所以对我来说,只有下面的解决方案才能正常工作:

 @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);}