2014-09-04 52 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