我有一个Android应用程序,其中根视图是一个FrameLayout
,它在轮换时保留并调整大小而不是重新创建。FrameLayout子视图在调整大小时没有正确更新
其中FrameView
的儿童是一个自定义View
(主视图),占用(以肖像模式)的整个空间,并且另一个定制View
我要显示为沿着底部边缘的窄带或右边缘(横向模式)。
为此我跑从主力的onSizeChanged()
方法如下代码:
boolean isBandShowing = ...; // whether the band should be shown
boolean isPortrait = ...; // whether we are in portrait mode, controls where the band is displayed
int horizontalBandHeight = ...; // default height for band in portrait mode
int verticalBandWidth = ...; // default width for band in landscape mode
bandView.setVisibility(isBandShowing ? View.VISIBLE : View.GONE);
LayoutParams bandLayoutParams = new FrameLayout.LayoutParams(
isPortrait ? LayoutParams.MATCH_PARENT : verticalBandWidth, // X
isPortrait ? horizontalBandHeight : LayoutParams.MATCH_PARENT, // Y
Gravity.BOTTOM | Gravity.RIGHT);
bandView.setLayoutParams(bandLayoutParams);
创建后,onSizeChanged()
被调用一次(在日志输出中可见),并设置了乐队,因为它应该。
然而,当旋转显示屏时,乐队的位置没有正确更新。第一次从人像转为风景后,乐队仍然显示在底部。当我旋转回肖像时,乐队向右移动 - 它始终落后。
添加一些日志输出,我可以看到以下内容:
onSizeChanged()
获得呼吁每转- 顶部的四个变量有正确的值(纵向/横向正确地反映了新的方向)
- 如果我查询从新创建
LayoutParams
的宽度和高度,他们的预期值 - 如果我调用后立即查询
bandView
尺寸,它们具有旧值(如旋转之前所显示的)。
我已经尝试了一些东西,但没有成功:
- 呼吁双方
FrameLayout
和乐队视图 - 两个 呼吁双方
- 调用
postInvalidate()
invalidate()
requestLayout()
- 在设置新的
LayoutParams
之前从FrameLayout
中删除bandView
,然后重新添加它
什么给?