Android RelativeLayout中wrap_content和alignParentBottom的冲突

继续随便记录一下,之前也说过,Android类似的坑不少。

下面又是一例:

RelativeLayout中,为了方便布局,子view经常会用到alignParentBottom/Top/Left/Right等,如:

android:layout_alignParentBottom="true"

但这时候需要注意的是,如果parent是wrap_content的话,alignParentRight就意味着要求parent的layout_width="match_parent"alignParentBottom就意味着要求parent的layout_height="match_parent"

这会带来什么问题那?两个问题:

  1. 显示错误。在布局嵌套的环境下,例如布局A包含B和C,在A里面,B above C:(伪布局代码)
RelativeLayout 
  width=match_parent
  height=match_parent
  id="A"

  XXLayout
    width=match_parent
    height=wrap_content
    above="C"
    id="B"

    RelativeLayout
      width=match_parent
      height=wrap_content
      id="C"

      XXView
        width=match_parent
        height=wrap_content
        android:layout_alignParentBottom="true"
        src=xxx

本意是希望在布局A里面,B可以在C上面显示,C里面显示xxx;

但是结果是:C会撑满A,然后导致B不可见。

改法很简单,去掉

android:layout_alignParentBottom="true"
```即可。

实际原因我没有去翻源码,不确定;但是猜测和Android的绘制/计算布局的方向有关,Android默认是从屏幕左上角向右下角绘制(在写自定义view,重载onDraw,或者坐标计算的时候需要依赖这种“特性”),所以在这种情况下,alignBottom或alignRight后,“画布”就自然而然被顶到**下边**和**右边**去了。
    
2. **性能**。对,就是性能;撑满屏幕意味着这个view(例如上面的C)的刷新,不只是局部刷新,而是整屏刷新(即使XXView可能只是一个bottom bar这种非全屏的view),所以不管是耗电量还是性能,都会受到一定的影响。

---

综上,在设计layout的时候,需要注意方向带来的影响,同时注意不同属性之间可能导致的“冲突”。
    
记录一下。