2014-09-04 45 views
0

我有一个处理方向变化的活动,我想在设备旋转时手动调整布局的大小。在该布局的onLayout,我叫setLayoutParams:Android 2.x setLayoutParams不适用于轮转?

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 

    if (changed) { 
     int orientation = getResources().getConfiguration().orientation; 
     // Only resize on actual orientation change 
     if (orientation != mLastOrientation) { 
      // Apply the new layout size 
      setLayoutParams(new LinearLayout.LayoutParams(someNewWidth, someNewHeight); 
      mLastOrientation = orientation; 
     } 
    } 
} 

这对我的新4.x的设备,但在2.x的设备工作正常,则setLayoutParams似乎运行一个方向“迟到”。

因此,在从肖像到风景的第一次旋转中,不会出现调整大小,然后在随后的旋转中,它会显示纵向上的横向大小,横向上的纵向大小等等。

我读了setLayoutParams源代码,它调用requestLayout,它应该重绘布局,但似乎没有立即做到这一点。我也尝试invalidate()哪个也不起作用。

关于为什么setLayoutParams不适用于第一轮或其他解决方案的任何想法?

回答

1

在布局过程中更改LayoutParams会导致多次布局过程完成,并且如果显示复杂布局时会导致严重放缓。

覆盖您的视图的onMeasure()方法并在那里设置测量的大小效率更高。请看这个回答https://stackoverflow.com/a/12267248/3811368这个技术的例子。

+0

我的'onMeasure()'函数在旋转时不会改变widthMeasureSpec和heightMeasureSpec的值。 – nicobatu 2014-09-04 22:43:47

+0

我假设我需要自己传递测量值: “如果您需要重写自定义ViewGroup的onMeasure,请更改widthMode,widthSize,heightMode和heightSize,使用MeasureSpec.makeMeasureSpec将它们编译回measureSpecs并传递生成的整数以super.onMeasure“。 – nicobatu 2014-09-04 22:46:12

+0

太棒了,工作!我也必须通过我创建的measureSpecs来衡量我的观点的孩子。谢谢! – nicobatu 2014-09-04 23:38:33