在安卓中设置布局参数

17

我可以很容易地使用XML文件并指定参数。

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

但是我在通过代码指定参数时感到困惑。对于每个视图,我都使用以下方式指定参数:

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

我看到我可以指定相对布局、帧布局等选项。 目前,我为所有视图(如图像、文本和GridView)使用线性布局。视图参数应该基于父元素的布局来定义吗?或者,即使视图是另一种布局(例如FrameLayout)的子项,也可以将其指定为线性布局吗?非常抱歉,但我找不到区别。


据我所知,您也可以使用RelativeLayout来实现相同的效果。 - Lavanya
这两者之间有什么区别吗? - Jerrin George
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也是一样:它可以将像abovebelowalightWithParent这样的值与每个视图相关联。而LinearLayout.LayoutParams根本没有这些功能。


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


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类型变量应该是由视图返回的类型... 检查视图返回的类型并在导入语句中导入该类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接