2012-09-20 55 views
0

我有這種場景: 一個水平的LinearLayout,填充容器和weightSum=100,兩個視圖內部各有50個權重。設置視圖的高度,通過只知道其寬度來設置廣場的重量

現在我該如何使這兩個視圖呈正方形(例如,高度必須等於它們的寬度)。 LinearLayout行的數量是未知的,所以基本上,我不能將它們包裝在這種情況下的垂直容器中。

+1

您是以編程方式或通過界面生成器創建這些佈局嗎? – zabawaba99

+0

通過Eclipse的XML編輯器。 –

回答

1

現在我該如何使這兩個視圖呈正方形(例如,高度必須是 等於它們的寬度)。

如果你只是在LinearLayout這兩個觀點,你有兩個選擇:

  1. 請勿直接設置您的佈局文件的內容視圖,而不是它充氣,所以你有一個參考該文件的根目錄。然後發佈對根查看一個Runnable,計算期望的高度和設置回至每個LinearLayout的兩個孩子的一個包裝它們:

    final View v = getLayoutInflater().inflate(
         R.layout.views_specialheight, null); 
    v.post(new Runnable() { 
    
        @Override 
        public void run() { 
         setupHeight((ViewGroup) v); 
        } 
    }); 
    setContentView(v); 
    

    其中setupHeight()是方法:

    private void setupHeight(ViewGroup vg) { 
        int count = vg.getChildCount(); 
        for (int i = 0; i < count; i++) { 
         final View v = vg.getChildAt(i);    
         if (v instanceof LinearLayout) { 
          int width = v.getWidth(); 
          LinearLayout.LayoutParams lp; 
          View one = ((LinearLayout) v).getChildAt(0); 
          lp = (LinearLayout.LayoutParams) one.getLayoutParams(); 
          lp.height = width/2; 
          one.setLayoutParams(lp); 
          View two = ((LinearLayout) v).getChildAt(1); 
          lp = (LinearLayout.LayoutParams) two.getLayoutParams(); 
          lp.height = width/2; 
          two.setLayoutParams(lp); 
         } 
        } 
    } 
    

    如果你只有一個包裝ViewGroup子類,這個方法將工作得很好,這個子類包裝了那些LinearLayout行。它可以(也應該)得到改進,但我相信你明白這一點。

  2. 第二個選擇是使用自定義的ViewGroup(這可能取決於你刨用LinearLayout做什麼使用),而不是LinearLayout這樣的:

    ​​

SpecialHeightViewGroup是這樣一個類:

class SpecialHeightViewGroup extends ViewGroup { 

public SpecialHeightViewGroup(Context context, AttributeSet attrs, 
     int defStyle) { 
    super(context, attrs, defStyle); 
} 

public SpecialHeightViewGroup(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public SpecialHeightViewGroup(Context context) { 
    super(context); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    if (widthMode == MeasureSpec.EXACTLY 
      || widthMode == MeasureSpec.AT_MOST) { 
     measureChildren(MeasureSpec.makeMeasureSpec(widthSize/2, 
       MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
       widthSize/2, MeasureSpec.EXACTLY)); 
     measureChildren(MeasureSpec.makeMeasureSpec(widthSize/2, 
       MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
       widthSize/2, MeasureSpec.EXACTLY)); 
     setMeasuredDimension(widthSize, widthSize/2); 
    } else { 
     widthSize = 800; // we don't have restrictions, make it as big as we want 
     measureChildren(MeasureSpec.makeMeasureSpec(widthSize/2, 
       MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
       widthSize/2, MeasureSpec.EXACTLY)); 
     measureChildren(MeasureSpec.makeMeasureSpec(widthSize/2, 
       MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
       widthSize/2, MeasureSpec.EXACTLY)); 
     setMeasuredDimension(widthSize, 400); 
    }  
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) {  
    View one = getChildAt(0); 
    one.layout(0, 0, getWidth()/2, getHeight()); 
    View two = getChildAt(1); 
    two.layout(getWidth()/2, 0, getWidth(), getHeight());  
} 

} 

自定義類沒有正確測試,所以它可能有錯誤(它只是一個例子)。

Offtopic:你是否有機會像在新的Windows手機上創建UI一樣?

+0

是的,我正在創建重新創建諾基亞Lumia用戶界面。例如:http://i.imgur.com/Lw85o.jpg 我從來沒有想過要創建一些簡單的東西,比如在Android中使用正方形的行。 –

+0

@ ColorWP.com第一種方法並不複雜,但最終取決於你如何處理這些行。你也可以看看'GridLayout'。 – Luksprog

相關問題