本文讲述 RelativeLayout 的 height 设置为 wrap_content,子控件的位置是 ALIGN_PARENT_BOTTOM 等相对父控件的设置时,导致wrap_content 的问题。
1. 场景还原
头上长草的小明接手了一段代码,该代码的作用是动态的显示从后台返回的文本数据。
首先是一个很简单的布局文件:
to_show_text_layout.xml
然后是对应的MainActivity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.to_show_text_layout);
TextView text = (TextView) findViewById(R.id.bannerView);
text.setText(getTextFromHttp());
}
}
小明认为,将 RelativeLayout 的 layout_height 设置为固定的 38dp 是不合理的,因为后台返回的文本长度未知,代码也没有对长度做截断处理。如果文本过长,肯定会出现文本溢出规定区域的现象。
于是,小明顺手将 38dp 改为“wrap_content”,心中甚至得意。运行一看,傻眼了,该 RelativeLayout 竟然铺满全屏了——这不科学!
2. 问题原因
显然,这种诡异的问题是 RelativeLayout 引发的。我们看下其官方文档:
A Layout where the positions of the children can be described in relation to each other or to the parent.
Note that you cannot have a circular dependency between the size of the RelativeLayout and the position of its children. For example, you cannot have a RelativeLayout whose height is set to WRAP_CONTENT and a child set to ALIGN_PARENT_BOTTOM.
文档说了,如果 RelativeLayout 的 height 是 wrap_content,而且它的子控件是 ALIGN_PARENT_BOTTOM,就会产生 circular dependency。
小明捋了捋头上草,点了点头。
3. 解决办法
解决方法有2:
1. 将 RelativeLayout 替换成 LinearLayout 等其他布局;
2. 保持 RelativeLayout,删除导致 circular dependency 的属性(android:layout_alignParentTop 等),将其子控件布局改为: