我有這種場景: 一個水平的LinearLayout,填充容器和weightSum=100
,兩個視圖內部各有50個權重。設置視圖的高度,通過只知道其寬度來設置廣場的重量
現在我該如何使這兩個視圖呈正方形(例如,高度必須等於它們的寬度)。 LinearLayout行的數量是未知的,所以基本上,我不能將它們包裝在這種情況下的垂直容器中。
我有這種場景: 一個水平的LinearLayout,填充容器和weightSum=100
,兩個視圖內部各有50個權重。設置視圖的高度,通過只知道其寬度來設置廣場的重量
現在我該如何使這兩個視圖呈正方形(例如,高度必須等於它們的寬度)。 LinearLayout行的數量是未知的,所以基本上,我不能將它們包裝在這種情況下的垂直容器中。
現在我該如何使這兩個視圖呈正方形(例如,高度必須是 等於它們的寬度)。
如果你只是在LinearLayout
這兩個觀點,你有兩個選擇:
請勿直接設置您的佈局文件的內容視圖,而不是它充氣,所以你有一個參考該文件的根目錄。然後發佈對根查看一個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
行。它可以(也應該)得到改進,但我相信你明白這一點。
第二個選擇是使用自定義的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一樣?
是的,我正在創建重新創建諾基亞Lumia用戶界面。例如:http://i.imgur.com/Lw85o.jpg 我從來沒有想過要創建一些簡單的東西,比如在Android中使用正方形的行。 –
@ ColorWP.com第一種方法並不複雜,但最終取決於你如何處理這些行。你也可以看看'GridLayout'。 – Luksprog
您是以編程方式或通過界面生成器創建這些佈局嗎? – zabawaba99
通過Eclipse的XML編輯器。 –