【发布时间】:2017-05-04 20:22:30
【问题描述】:
我添加了一个自定义视图作为 LinearLayout 的子项。无论父视图组如何,我都需要这个自定义视图锚定到底部。这就是我的做法。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!drawn) {
drawn = true;
Rect rect = new Rect();
((View) getParent()).getGlobalVisibleRect(rect);
setY(rect.bottom - rect.top - getContext().getResources().getDimension(R.dimen.bottom_bar_height));
setZ(UiUtils.dpToPx(8f));
forceLayout();
bringToFront();
} else {
binding.bottomBarLl.draw(canvas);
}
}
当我将自定义视图添加到 LinearLayout 父级时,如果该子级之上的子级具有 match_parent 高度,则不会显示该视图。
下面是布局检查器的屏幕截图,显示已布局但未显示。
inspector 还显示自定义视图的 getZ() 为 24。
我正在为 API 级别 21+ 构建,但我也在 onDraw() 中尝试了 ((View) getParent()).invalidate(); 和 getParent().requestLayout();,但效果不佳。
来自View.bringToFront()的文档
上门
在 API 级别 1 中添加
void bringToFront()
更改视图的 z 顺序 树,所以它位于其他兄弟视图之上。此排序更改 可能会影响布局,如果父容器使用顺序依赖 布局方案(例如,LinearLayout)。在 KITKAT 之前,这种方法应该 随后调用视图的 requestLayout() 和 invalidate() parent 强制父级使用新的子级排序重绘。
这应该可以工作,但它不适合我。我做错了什么?
【问题讨论】:
标签: android android-layout android-linearlayout android-custom-view