权重属性layout_height
在布局控件中(如LinearLayout),子控件可以根据权重值(默认为0)来分配所占据的空间,这需要结合layout_width或layout_height的值进行分类:
1)如果子控件layout_weight都为“match_parent”(子控件都“争取”),控件根据权重值反比分配空间;
2)如果子控件layout_weight都为0dip(子控件都“谦让”),根据权重值的正比分配空间;
3)如果有子控件的权重为0,则权重值表示填充顺序而非比例关系;
第(3)种情况的一个布局例子如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>
<EditText
android:layout_width="<span style="color:#ff0000;">match_parent</span>"
android:layout_height="wrap_content"
android:hint="输入关键字"
android:layout_weight="1" />
<Button
android:layout_width="<span style="color:#ff0000;">wrap_content</span>"
android:layout_height="wrap_content"
android:text="搜索"
android:layout_weight="0"
/>
</LinearLayout>
显示截图如下:
控件(View)属性
在XML布局文件中,任何一个控件(如Button)都有很多属性,为配置布局文件带来极大困难和迷惑,实际上,任何一个控件的属性都由两部分组成,一个是控件自带的属性,这个事固定的,一个是控件相对于父容器(ViewsGroup)的属性,这个因父容器的不同而变化,具体而言:
1)自带的属性,比如layout_width,layout_height
2)相对于父容器(ViewsGroup),比如在linearLayout中,子控件有layout_weight属性,而在RelativeLayout中,没有该属性,这些属性是通过父容器的LayoutParams进行管理。
Java语言实现布局文件(XML)视图
通过设置布局文件中ViewGroup和View的属性,可以形成各种各样的视图,但XML是一种标记语言,Android并不能直接执行,而是通过Layoutinflate类解析XML文件,并根据XML中的ViewGroup、View创建ViewGroup、View的Java类实例,这些类的实例属性值就是XML中设置的属性值,即XML语言标记的视图,可以通过Java语言同等实现。
以下是一个Demo,实现上面的视图:
package com.example.javaimplementxml;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
// 根目录LinearLayout相对于外面仍然是子视图
LinearLayout ll = new LinearLayout(this);// 新建容器
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
ll.setLayoutParams(lp);
// 新建LinearLayout的子控件EditText,并设置属性
EditText et = new EditText(this);
et.setHint("输入搜索关键字"); //EditText自有属性
//EditText相对于LinearLayout的属性
LinearLayout.LayoutParams lpet = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT, 1);
et.setLayoutParams(lpet);
ll.addView(et, 0);
// 新建LinearLayout的子控件Button,并设置属性
Button bt = new Button(this);
bt.setText("搜索"); //Button自有属性
//Button相对于LinearLayout的属性
LinearLayout.LayoutParams lpbt = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT, 0);
bt.setLayoutParams(lpbt);
ll.addView(bt, 1);
setContentView(ll);//setContentView的参数,或者是资源ID,或者是View
}
}