#布局笔记
1. 线性布局:
LinearLayout:
- layout_gravity:和gravity不同的是,gravity是用于指定文字在控件中的对齐方式;layout_gravity用于指定控件在布局中的对齐方式
- weight:
(权重):每个控件所占的比例
LinearLayout特有的属性它表示比重的意思,可实现百分比布局
如果控件为“match_parent”,则layout_weight的值与占用比重是反相关的,其值越大,它占用的比重越小。
如果控件为"wrap_content",则对比重的判断会变为正相关,即其值越小,占用的空间越少
一个页面中,有一个有权重的的控件和一个无权重的控件,系统会先给无权重的控件分配空间。
2. 相对布局:
RelativeLayout:
相对于父布局进行定位:
layout_alignParentRight
layout_alignParentLeft
layout_alignParentTop
layout_alignParentBottom
layout_centerInParent
layout_centerVertical:垂直居中
layout_centerHorizontal:水平居中
layout_centerInParent:父类居中
相对于控件进行定位:layout_centerInParent="true"
layout_above="@id/button"
layout_below="@id/button"
layout_toLeftOf="@id/button"
layout_toRightOf="@id/button"
【注】
相对布局:按照控件之间的相互位置进行排布。存在一个参照物的概念一般来说再相对布局重的空间都会存在id的属性
centerInparent:位于父类的中部
alignParentRight :对齐父类的右方,其中方向性的单词可以更换
toRightOf:在某个控件的右方,方向性的单词可以更换
alignBottom:底部对齐
alignRight:右部对齐,
@+id:表示的是系统中本来不存在对应的id值,需要将这个主d值诗加到系统当中,
@id,表示从系统中去除已经填加好的id
alignBaseLine:基准线对开,
针对相对布局而言,一般都不会过多的给定很多相关联的属性,否则模合性就会大大增加,
3.表格布局:
TableLayout是继承子LinearLayout的(可以不指定宽和高,系统会自动给定)
- TableRow:表示一行
- 可以使用layout_weight对每一列的权重进行分配(因为继承了LinearLayout)
- stretchColumns:拉伸某一列。让布局显得不紧凑(参数为0,1,2,3...)
- shrinkColumns:回缩某一列。让整体的内容都得以实现。(参数为0,1,2,3...)
- collapseColumns:隐藏某一列(参数为0,1,2,3...)
4. 帧布局:
frameLayout
- 所有的控件都会默认摆放在布局的左上角
- 在帧布局中定义的控件每一个都是以画面的形式进行呈现
- 最开始定义的控件出现在最下方,最后定义的控件出现在最上方(表面)
- 位置:可通过layout_gravity=""对位置进行修改,也可以用margin
应用:
- 帧布局可以使用手机联系人的导航显示上字母的呈现。
- 帧布局使用在帧动画。
5.绝对布局:
AbsoluteLayout
- AbsoluteLayout又可以叫做坐标布局,可以直接指定子元素的绝对位置
- 这种布局简单直接,直观性强
- 使用android:layout_x属性来确定X坐标,以左上角为顶点。
使用android:layout_y属性确定Y坐标,以左上角为顶点。
- 如果子元素不设置和那么它们的默认值是0,会出现在左上角。
- 由于手机屏幕尺寸差别较大,使用绝对定位的适应性会比较差,不推荐使用
6.网格布局:
GridLayout
网格布局:在4.0之后出现的布局,
columnCount:存在多少列
RowCount:存在多少行
layout_rowSpan:占据多少行
layout_columnSpan占据多少列
【注】GridLayout和TableLayout有什么不同?TableLayout定义TableRow来呈现内容
GridLayout中可以定义控件来直接使用,
表格布局中只能合并列不能合并行,但是在网格布局中既能和并列也能合并行
7. 百分比布局:
PercentFrameLayout
使用前:在app/build.gradle文件,dependencies闭包中添加:
implementation com.android.support:percent:28.2.1
【注】每当修改gradle文件后,需要点击Sync Now对代码进行同步。
用法:
- app:layout_widthPercent="50%"
- app:layout_heightPercent="50%"
8. 引入布局:
先在布局中建一个title.xml,再在activity_main.xml中引用:
用法:
ActionBar actionBar = getSupportActionBar();
if(actionBar != null){
actionBar.hide();
}
9. 自定义控件:
创建一个TitleLayout继承LinearLayout
public class TitleLayout extends LinearLayout {
public TitleLayout(Context context, AttributeSet attrs){
super(context,attrs);
//LayoutInflater.from 构建出一个LayoutInflater对象,后调用inflate动态加载一个布局文件
LayoutInflater.from(context).inflate(R.layout.title,this);
Button titleBack = findViewById(R.id.title_back);
Button titleEdit = 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();
}
});
}
}
在activity_main.xml中添加这个自定义控件:
//此项目名为uicustomviews