使用XML文件很简单,因为我可以将参数指定为
<android:layout_width="fill_parent" android:layout_height="wrap_content">
但是我在通过代码指定它时感到困惑。对于每个视图,我使用
指定参数view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
我看到我可以选择将其指定为相对布局,框架布局等。 截至目前,我正在为所有视图使用线性布局,例如图像,文本和gridview。是否应根据父元素的布局定义视图参数?或者将它指定为线性布局是否可以,即使视图是例如framelayout的子节点?对不起,但我找不到区别。
答案 0 :(得分:17)
所有布局类(LinearLayout
,RelativeLayout
等)都会扩展ViewGroup
。
ViewGroup
类有两个静态内部类:LayoutParams
和MarginLayoutParams
。 ViewGroup.MarginLayoutParams
实际上延伸了ViewGroup.LayoutParams
。
有时布局类需要额外的布局信息才能与子视图相关联。为此,他们定义了内部静态LayoutParams
类。例如,LinearLayout
有:
public class LinearLayout extends ViewGroup {
...
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
...
}
}
RelativeLayout
同样如此:
public class RelativeLayout extends ViewGroup {
...
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
...
}
}
但LinearLayout.LayoutParams
和RelativeLayout.LayoutParams
是完全不同的独立类。它们存储有关子视图的不同附加信息。
例如,LinearLayout.LayoutParams
可以将weight
值与每个视图相关联,而RelativeLayout.LayoutParams
则不能。与RelativeLayout.LayoutParams
相同:它可以将above
,below
,alightWithParent
等值与每个视图相关联。并且LinearLayout.LayoutParams
根本没有这些能力。
因此,通常,您必须使用封闭布局中的LayoutParams
来正确定位和渲染视图。但请注意,所有LayoutParams
都有相同的父类ViewGroup.LayoutParams
。如果您只使用该类中定义的功能(例如您的WRAP_CONTENT
和FILL_PARENT
),即使使用了错误的LayoutParams
类来指定布局参数,您也可以获得正常工作的代码
答案 1 :(得分:10)
根据您想要更改布局的视图数量,我认为最好创建一个辅助方法并将您想要更改的任何视图传递给方法以及您希望它们更改为的高度和宽度值:
public void setWidthHeight(View v, int width, int height){
LayoutParams lp;
lp = v.getLayoutParams();
lp.width = width;
lp.height = height;
v.setLayoutParams(lp);
}
请记住,此处设置宽度和高度不会与xml中的相同值匹配,即android:layout_width =“32dp”与lp.width = 32不相同;
另外,名为lp的LayoutParams类型变量应该是视图返回的类型...检查视图返回的类型并在import语句中导入该类型。