2016-01-27 63 views
1

我有一个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,然后重新添加它

什么给?

回答

1

正如我基于日志的输出产生了怀疑,在UI的胆量的东西还没有被时间onSizeChanged()更新被调用。我还没有弄清楚什么,但外带的是,LayoutParams的东西需要推迟,直到一切都完成了。

static boolean isBandShowing = ...; // whether the band should be shown 
static boolean isPortrait = ...;  // whether we are in portrait mode, controls where the band is displayed 
static int horizontalBandHeight = ...; // default height for band in portrait mode 
static int verticalBandWidth = ...; // default width for band in landscape mode 

frameLayout.post(new Runnable() { 
    @Override 
    public void run() { 
     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); 
    } 
}); 

这解决了这个问题:这可以通过包装的代码放到一个Runnablepost()荷兰国际集团是在FrameLayout完成。

相关问题