自定义子视图bringToFront无法按预期工作

时间:2016-12-19 17:59:17

标签: android android-layout android-linearlayout android-custom-view

我添加了一个自定义视图作为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高度,则此子级不会显示。

以下是布局检查器的屏幕截图,其中显示了布局但未显示的内容。

enter image description here

检查器还显示自定义视图的getZ()为24。

我正在为API级别21+构建,但我也在onDraw()中尝试了((View) getParent()).invalidate();getParent().requestLayout();,但没有任何好处。

来自View.bringToFront()

的文档
  

bringToFront

     

在API级别1中添加

     

void bringToFront()

     

更改视图的z顺序   树,所以它在其他兄弟视图之上。这个订单改变   如果父容器使用依赖于订单,则可能会影响布局   布局方案(例如,LinearLayout)。在KITKAT之前,这种方法应该   然后在视图上调用requestLayout()和invalidate()   父级强制父级使用新的子级排序重绘。

这应该有效,但不适合我。我做错了什么?

1 个答案:

答案 0 :(得分:0)

像其他无法使用LinearLayout的问题一样,我最后也使用了协调器布局,其中线性布局和我的自定义视图是兄弟姐妹,事情正常。如果有人能够解释文档,那将会很棒,因为它会产生误导。