1. LinearLayout
① android:orientation=“vertical/horizontal”
让控件在垂直/水平方向上排列
注意:若排列方向为horizontal,内部的空间不能将宽度指定为match_parent.,否则单独一个控件会将水平方向占满;同理,排列方向为vertical时,控件高度不能指定为match_parent.
②android:layout_gravity 指定控件在布局中的对齐方式
android:gravity 指定文字在控件中的对齐方式,两者注意区分。
注意:当设置排列方向是horizontal时,只有垂直方向上的对齐方式才会生效;同理,设置排列方向是vertical时,只有水平方向上的对齐方式才会生效。
③android:layout_weight 使用比例的方式来指定控件的大小
如:
<EditText
android:id="@+id/input_message"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Type something"/>
<Button
android:id="@+id/send"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Send"/>
在这里,将android:layout_width设置为0是一种规范的写法。因为设置了layout_weight后,控件的宽度便由它来决定。
两个控件的layout_weight都设置为1时,相当于各占一半的宽度;若分别设置为3和2,则宽度各占3/5和2/5.
一个比较好的方法:当要设置搜索框或发送框时,可将TextView的layout_weight设置为1,搜索或发送按钮的layout_width设置为wrap_content.
2 . RelativeLayout (相对布局)
①设置相对于父布局的位置
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
将控件固定在父布局的左上方,其他情况可类推。
②设置相对于某个控件的位置
android:layout_above="@id/button1"
android:layout_toLeftOf="@id/button1"
将控件固定在button1的左上方。(下方为below)
注意:当一个控件去引用另一个控件的id时,该空间一定要定义在引用控件的后面,否则会出现找不到id的情况。
3 . FrameLayout
所有控件都摆放在布局的左上角,应用场景比较少。
4 . TableLayout 允许我们使用表格的方式来排列控件
①表示一行。有多少个就表示有多少行。
在中每加入一个控件,就表示在该行中加入了一列。
②使用android:layout_span="2"
让控件占据两列空间
③使用android:stretchColumns="1"
使当前控件进行拉伸,以达到自适应屏幕宽度的作用。注意,其中“1”表示将第二列进行拉伸,“0”表示第一列。
注意:若实际内容超出屏幕大小,可在布局外嵌套一个ScrollView标签来实现上下滑动
5 .自定义控件
①引入布局
step1:在layout文件夹下新建一个title.xml的布局,实现标题栏的功能。
step2:在需要引入title.xml的布局中加入如下代码:
<include layout="@layout/title" />
即可引入标题栏
step3:在onCreate()中隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
②创建自定义控件
step1:java文件夹下新建TitleLayout继承自LinearLayout,即自定义标题栏控件。代码如下:
public class TitleLayout extends LinearLayout{
public TitleLayout(Context context,AttributeSet attrs){
super(context,attrs);
LayoutInflater.from(context).inflate(R.layout.title,this);
}
}
以上代码重写了LinearLayout中带有两个参数的构造函数,在布局中引入TitleLayout控件时就会调用这个构造函数。
LayoutInflater实现了标题栏布局的动态加载,通过LayoutInflater的from()方法可以构建出一个LayoutInflater对象,调用inflate()方法就可以动态地加载一个布局文件了。
inflate()方法接收两个参数,第一个是要加载的布局文件的id,第二个是给加载好的布局再添加一个父布局,此处我们指定为TitleLayout,所以直接传入this。
step2:在需要添加这个控件的布局里加入如下代码:
<com.example.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.uicustomviews.TitleLayout>
在添加自定义控件时,要指定控件的完整类名,包名不能省略。
step3:为按钮注册点击事件
最后,在TitleLayout里添加以下代码:
Button titleBack=(Button) findViewById(R.id.title_back);
Button titleEdit=(Button) findViewById(R.id.title_edit);
titleBack.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
((Activity) getContext()).finish();
}
});
titleEdit.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Toast.makeText(getContext(),"You clicked Edit button",Toast.LENGTH_SHORT).show();
}
});
我在编写代码的时候遇到了以下问题:
1、新创建的title.class文件该不该注册?
答:不用。需要在AndroidManifest.xml中注册的只有四大组件:活动,服务,广播接收器,内容提供器。
2、一定要注意,在activity_main中引入控件时,包名要正确、完整。