Android基础之七:UI开发

  • 需要用到的编程元素
    • 视图:View,可视化元素的基类,所有组件、视图等都是由View派生出去的
    • 视图组:ViewGroup,是View的扩展,可以包括多个子视图
    • Fragment:类似于前期的Activity碎片,拥有独立的布局,但是需要绑定到Activity上
    • Activity:基本显示单元,用于显示界面
  • 布局
    • 布局管理器是基于ViewGroup的扩展,用来控制子控件的位置,是能够嵌套的
    • 一个布局通常用单独的布局文件来定义,实现代码与资源的分离化,便于管理
    • Android SDK中提供了许多布局类,可以通过使用这些布局类来实现布局,也可以修改这些类,创建自己的布局
      • FrameLayout
        • 最简单的布局管理器
        • 基于左上角布局
        • 通过gravity可以改变位置
        • 重叠布局
        • margin属性定义位置无效
      • LinearLayout
        • 线性布局
        • 必须定义布局方向:oritation
        • 一行或一列只能有一个视图组件
        • 可以通过margin或gravity来定义位置
      • RelativeLayout
        • 相对布局
        • 最灵活的布局,能够实现布局相对于屏幕边界距离来布局
        • 默认相对top,left布局
        • 当然子布局也可以相对于其他组件定位
      • GridLayout
        • 举矩形网格布局
        • Android4.0以后才可以使用
        • 简化了布局嵌套
    • 定义布局
      • 在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通信
原文地址:https://www.cnblogs.com/xl-xlg/p/5045631.html