Android 开发中的那些正确姿态

记录 Android 开发中那些小技巧

  1. 尝试使用 ConstraintLayout 约束布局来解决布局嵌套过多的问题。
  2. 使用 <include> 标签来引用共同的布局文件,同时可搭配 <merge> 标签来减少视图层级结构。

    1
    <include layout="@layout/common_title"/>
  3. 使用 ViewStub 实现延迟加载,加快渲染。需要显示时 setVisibility(View.VISIBLE) 即可。(ViewStub 不支持 <include> 标签)

    1
    2
    3
    4
    5
    6
    7
    <ViewStub
    android:id="@+id/stub"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/common_title1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center" />
  1. 使用 TextView 的 android:drawableLeft=”@drawable/xxx” 等来属性代替 TextView + ImageView 的方案。
  2. 使用 TextView 的 android:lineSpacingExtra=”12dp”属性来设置行间距。
  3. 使用 LinearLayout 自带的分隔线 divider 属性来代替 1dp View的方案。

    1
    2
    3
    4
    5
    6
    7
    8
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@drawable/divider_line"
    android:dividerPadding="16dp"
    android:showDividers="middle"
    android:orientation="vertical">

    android:showDividers 属性可以设置如下4个值:

    • none:不显示分隔线;
    • beginning:在 LinearLayout 的开始处显示分隔线;
    • end:在 Linearlayout 的结尾处显示分隔线;
    • middle:在 LinearLayout 中的每两个组件间显示分隔线;
  4. 使用 shape 来减少图片资源的占比。

  5. 使用 android.support.v4.widget.Space 轻量级控件来占据一定的空间。(不支持 android:background 属性)
  6. 使用 Vectors 替代 PNG。(Android Studio 自带很多,也可以导入外部 SVG 生成 Vector)
  7. 小心使用 @android:color/transparent
  8. xml 布局中善用 tools 属性来预览控件效果。

    Tools 工具的使用仅仅针对 IDE 有效,并不会被打包进应用。

  9. 使用 Spannable 或 Html.fromHtml 来实现富文本显示。
  10. LinearLayout 中 android:weightSum 和 android:layout_weight 一起使用更配哦。
  11. 使用 android:descendantFocusability 解决 ViewGroup 与 Children View 之间的焦点占用问题。

    android:descendantFocusability 属性可以设置如下4个值:

    • beforeDescendants:ViewGroup 会优先其子类控件而获取到焦点
    • afterDescendants:ViewGroup 只有当其子类控件不需要获取焦点时才获取焦点
    • blocksDescendants:ViewGroup 会覆盖子类控件而直接获得焦点
  12. 使用 android:duplicateParentState 属性表示是否将 View 自身的 drawable state 交给直接 parent ViewGroup 控制。
  13. 使用 android:fillViewport=”true” 可以将 ScrollView 填满屏幕。
  14. ImageView 的 android:adjustViewBounds 属性为是否保持原图的长宽比,单独设置不起作用,需要配合 maxWidth 或 maxHeight 一起使用。
  15. Elevation 实现控件阴影效果。

    api >= 21 时,通过 android:elevation 或者 setElevation() 实现
    api < 21 时,通过 ViewCompat.setElevation(View view, float elevation) 实现,前提要设置 view 的背景。