Android 通过只知道视图的宽度和重量来设置视图的高度,使其成为方形
我有这样一个场景: 一个水平线性布局,用于填充容器和Android 通过只知道视图的宽度和重量来设置视图的高度,使其成为方形,android,Android,我有这样一个场景: 一个水平线性布局,用于填充容器和weightSum=100,内部有两个视图,每个视图的重量为50 现在我如何使这两个视图成正方形(例如,高度必须等于其宽度)。LinearLayout行的数量是未知的,因此基本上,在这种情况下,我无法将它们包装在带有权重的垂直容器中 现在我如何使这两个视图成正方形(例如,高度必须为 等于它们的宽度) 如果在线性布局中只有这两个视图,则有两个选项: 不要直接将布局文件设置为内容视图,而是将其放大,以便从该文件中引用根目录。然后在该根视图上发布一个
weightSum=100
,内部有两个视图,每个视图的重量为50
现在我如何使这两个视图成正方形(例如,高度必须等于其宽度)。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);
}
}
}
SpecialHeightViewGroup
是这样一个类:
<com.luksprog.oat.views.SpecialHeightViewGroup
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0077cc"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#99cc00"
android:text="Button" />
</com.luksprog.oat.views.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());
}
}
自定义类没有经过适当的测试,因此可能有bug(这只是一个示例)
Offtopic:您是否正在尝试在新的Windows手机上创建一个类似于“瓷砖”的用户界面?您是通过编程方式还是通过界面生成器?通过Eclipse的XML编辑器创建这些布局。是的,我创建这些界面是为了重新创建诺基亚Lumia用户界面。例如:我从来没有想到在Android中创建像一堆带有正方形的行这样简单的东西会这么复杂。@ColorWP.com第一种方法没有那么复杂,但最终它取决于如何处理这些行。您可能还需要查看GridLayout
。