17

使用 XML 文件很容易,因为我可以将参数指定为

<android:layout_width="fill_parent" android:layout_height="wrap_content">

但是我在通过代码指定它时感到困惑。对于每个视图,我使用指定参数

view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT)); 

我看到我可以选择将其指定为相对布局、框架布局等。到目前为止,我正在为所有视图(例如图像、文本和网格视图)使用线性布局。视图参数是否应该根据父元素的布局来定义?或者即使视图是框架布局的子级,也可以将其指定为线性布局?对不起,但我找不到区别。

4

2 回答 2

19

所有布局类(LinearLayout,RelativeLayout等)都扩展ViewGroup.

该类ViewGroup有两个静态内部类:LayoutParamsMarginLayoutParams. 而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.LayoutParamsRelativeLayout.LayoutParams是完全不同的独立类。它们存储有关子视图的不同附加信息。

例如,LinearLayout.LayoutParams可以将weight值与每个视图关联,而RelativeLayout.LayoutParams不能。与 相同:它可以将, ,RelativeLayout.LayoutParams等值与每个视图相关联。而且根本没有这些能力。abovebelowalightWithParentLinearLayout.LayoutParams


所以一般来说,你必须使用LayoutParamsfrom 封闭布局来使你的视图正确定位和渲染。但请注意,它们LayoutParams都有相同的父类ViewGroup.LayoutParams。而且,如果您只使用在该类中定义的功能(例如在您的情况下WRAP_CONTENTFILL_PARENT),即使使用错误LayoutParams的类来指定布局参数,您也可以获得工作代码。

于 2011-06-23T12:42:27.960 回答
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 类型变量应该是视图返回的类型...检查视图返回的类型并在导入语句中导入该类型。

于 2012-05-01T22:37:56.580 回答