布局的作用
- 布局:布局是指对界面结构的全面规划与安排,通过api中提供的各种布局能够快速的完成对于界面的设计
- 设计角度:设计师设计布局需要考虑美感要素(如按钮与文本的颜色搭配),而程序员要关注控件间的摆放关系
- 实现方法:
- 使用API提供的布局框架
- 分析界面元素关系后选择合适布局
- 优势: 能快速完成界面实现
布局的种类
线性布局(LinearLayout)
- 排列方式: 子视图按照从上到下或从左到右的顺序依次排列,分为垂直线性布局和水平线性布局两种方向
- 代码顺序: 写在最前面的子视图会放在最左边或最上面,后续视图依次向右或向下排列
- 适用场景: 当控件需要从左至右或从上往下的规律排列时使用,是日常开发中使用最多的布局
- 特点: 大部分布局效果都可以用线性布局实现,但不一定是最优选择
相对布局(RelativeLayout)
- 核心概念: 子视图的摆放位置不依赖于代码顺序,而是通过参照物确定(需要重点掌握参照物的选取和相对位置的定义方法)
- 相对特性: 每个视图需要指定相对于其他视图或父容器的位置关系
- 优势: 比线性布局更灵活,适合处理复杂的视图层级关系
帧布局(FrameLayout)
- 层次结构: 类似扑克牌堆叠,子视图按添加顺序一层层叠加
- 显示特点: 上层的视图会遮盖下层视图,特别是当上层视图较大时
- 使用技巧: 通过控制视图大小可以避免完全遮盖下层内容
- 应用场景: 适合需要视图叠加显示的效果,如悬浮按钮等
表格布局(TableLayout)
- 排列方式: 类似表格的行列结构,有很强的规律性
- 适用场景: 适合计算器等需要整齐行列排列的界面
网格布局(GridLayout)
- 相似布局: 与表格布局类似,都能创建整齐的行列排列
- 区别: 网格布局(GridLayout)是后期新增的布局,与表格布局(TableLayout)在实现方式上有差异
- 特点: 提供了更灵活的网格控制能力
约束布局(ConstraintLayout)
- 特点:通过锚点约束定位,减少嵌套层级,适合复杂界面
- 现代布局: 是目前使用非常广泛的一种布局方式
- 优势: 可以用较少代码实现复杂的布局效果
添加布局的方式
XML文件设计
- XML文件设计:通过XML文件定义布局结构,使用setContentView()方法加载布局文件
- 实现方式:在res/layout目录下创建XML布局文件
- 加载方法:通过setContentView(R.layout.文件名)指定布局
- 优势:可视化程度高,支持实时预览,便于维护
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
- XML优势:
- 属性值清晰可见
- 支持Design视图实时预览
- 实现界面与逻辑分离
- 维护性:XML文件更易于后期修改和调整
Java代码添加
- Java代码添加:通过纯Java代码创建和配置布局对象,直接设置视图内容
- 实现步骤:
- 创建布局对象:new LinearLayout(context)
- 设置布局参数:setLayoutParams()
- 配置布局属性:如setBackgroundColor()
- 设置内容视图:setContentView(view)
- 缺点:代码量大,不直观,维护困难
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
// 1. 根布局为线性布局
LinearLayout ll = new LinearLayout(this);
// 2. 设置宽高
ll.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
// 3. 背景设置为红色
ll.setBackgroundColor(Color.RED);
// 4. 制定此activity的内容视图为该线性布局
setContentView(ll);
}
}