- 需要用到的编程元素
- 视图:View,可视化元素的基类,所有组件、视图等都是由View派生出去的
- 视图组:ViewGroup,是View的扩展,可以包括多个子视图
- Fragment:类似于前期的Activity碎片,拥有独立的布局,但是需要绑定到Activity上
- Activity:基本显示单元,用于显示界面
- 布局
- 布局管理器是基于ViewGroup的扩展,用来控制子控件的位置,是能够嵌套的
- 一个布局通常用单独的布局文件来定义,实现代码与资源的分离化,便于管理
- Android SDK中提供了许多布局类,可以通过使用这些布局类来实现布局,也可以修改这些类,创建自己的布局
- FrameLayout
- 最简单的布局管理器
- 基于左上角布局
- 通过gravity可以改变位置
- 重叠布局
- margin属性定义位置无效
- LinearLayout
- 线性布局
- 必须定义布局方向:oritation
- 一行或一列只能有一个视图组件
- 可以通过margin或gravity来定义位置
- RelativeLayout
- 相对布局
- 最灵活的布局,能够实现布局相对于屏幕边界距离来布局
- 默认相对top,left布局
- 当然子布局也可以相对于其他组件定位
- GridLayout
- 举矩形网格布局
- Android4.0以后才可以使用
- 简化了布局嵌套
- FrameLayout
- 定义布局
- 在layout资源文件夹中创建xml布局文件来实现布局的编辑
- 一般根元素是LinearLayout
- 其中常用属性与值
- wrap_contant:用于设置width或height值,表示根据内容计算
- match_parent:用于设置width或height值,表示与父元素大小一样
- fill_parent:用于设置width或height值,表示填充到与父元素允许的大小,与match_parent基本相同
- gravity:内部元素的位置
- layout_gravity:自身相对于父元素的位置,注意在FrameLayout中不起作用
- textAllCaps:字母大小写显示标志
- hint:类似于placeholder,水印提示
- entries:adapter适配器填充,用于列表组件等填充数据
- 代码创建布局(虽然强烈建议不要使用)
- 每个布局元素都有对应的类,通过这些类能够实现代码中构造布局
- 实例代码
-
LinearLayout linearLayout=new LinearLayout(MyActivity.this); TextView tv=new TextView(MyActivity.this); LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(100,50); linearLayout.addView(tv,layoutParams);
- 通过findViewById来获取contView布局文件中的子元素
- 布局文件xml转换成view
- LayoutInflator类是专门用于将layout布局文件解析成View实例的工具类
- 获取LayoutInflator实例的方法
- Activity中getLayoutInflator()
- 内部静态方法LayoutInflator.from(context)
- 系统Service获取:(LayoutInflator)getSystemService(Context.LAYOUT_INFLATOR_SERVICE);
- 布局嵌套
- 填充布局开销非常大,复杂的界面需要使用大量的布局去嵌套
- 注意规避UI布局的冗余
- 减少不必要的父元素,例如FrameLayout子元素只有一个LinearLayout,那么这个FrameLayout还有什么意义,等等。。
- 布局填充merge与include结合使用
- include是将一个布局插入到另一个布局中的用法
- 子布局父元素设置为FrameLayout等布局都是比较消耗资源的,可以使用merge代替根元素,merge在填充的时候会自动删除
- 不要使用太多的View,太多的View填充需要消耗大量时间和资源,影响程序响应速度,单个不居中包含的View不能超过80个,越少越好
- 如果存在大量的view,那么就用ViewStub来控制暂时不需要显示的view
- ViewStub
- ViewStub能够创建暂时不需要显示的View布局,可以动态创建,也可以布局文件静态配置
- 当需要显示的时候通过ViewStub实例的inflate或者setVisibility来显示
- inflate与setVisibility的区别
- inflate只能填充一次,用于视图的填充,填充后会被置空,不能第二次调用inflate方法,否则会抛出异常
- setVisibility能够多次显示隐藏控制ViewStub,因此建议使用setVisibility
- ViewStub中的元素只有在被填充后才能通过findViewById来获取,否则会抛异常
- 拆分布局Fragment
- Fragment是新一代碎片组件,取代了最初的Activity碎片的设计,比Activity更轻量,有用自己完整的生命周期
- Fragment能过实现不同屏幕大小设备创建灵活的UI
- 每个Fragment是独立的模块,并且是绑定在Activity上的,关系是多对多
- Fragment是在Android3.0以后出现的,在3.0以前如果使用必须继承自FragmentActivity
- Fragment的使用
- 创建
- 创建一个继承自Fragment的类,在Android3.0以后是android.app.Fragment;之前是android.support.v4.app.Fragment
- 在onCreateView中填充需要的布局
- 创建Fragment自己的布局文件资源,可以创建不同屏幕大小的资源,在onCreateView中动态判断填充的资源
- 创建
- Fragment的生命周期
- onAttach:将Fragment绑定到Activity上
- onCreate:创建
- onCreateView:填充视图
- onActivityCreated:Activity填充完毕
- onResume
- onPause
- onSaveStateInstance
- onStop
- onDestoryView:清空视图
- onDestory:销毁
- onDetach:解除绑定
- Fragment与Activity通信