安卓的布局有很多种,每种都有对应的LayoutParams类,那么它们之间到底是什么关系?
为什么在编写Layout的XML文件时,有的layout_前缀属性有用有的没有用?
一句话道出LayoutParams的本质:LayoutParams是Layout提供给其中的Children使用的。我们来看一段不用XML文件创建布局的代码。
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/69c5a8ac3fa60e0848d784a6dd461da6.gif)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
TextView tv = new TextView(this);
tv.setText("I am a text view, haha");
tv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
ll.addView(tv);
setContentView(ll);
}
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/69c5a8ac3fa60e0848d784a6dd461da6.gif)
可见LayoutParams的对象是设置在Layout中的Child View上的,而不是设置在自己上。就是说View想要放到某种Layout中,就必须设置这个Layout规定的LayoutParams。
每一种Layout实现不同的布局方式都有其独特的参数设置,例如LinearLayout.LayoutParams的weight属性,用来设置Child View之间的大小比例,如果把这个设置给FrameLayout是没有意义的,因为FrameLayout并不会排列Child View而是会都“挤在一起”。所以在XML文件里设置View的属性的时候,有的layout属性是无效的,也是没有意义的。