Android RelativeLayout中wrap_content和alignParentBottom的冲突
Posted
继续随便记录一下,之前也说过,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"
这会带来什么问题那?两个问题:
- 显示错误。在布局嵌套的环境下,例如布局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的时候,需要注意方向带来的影响,同时注意不同属性之间可能导致的“冲突”。
记录一下。