【问题标题】:Custom child view bringToFront not working as expected自定义子视图 bringToFront 无法按预期工作
【发布时间】: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


    【解决方案1】:

    与其他无法使用 LinearLayout 的问题一样,我最终也使用了协调器布局,其中线性布局和我的自定义视图是同级的,并且一切正常。如果有人能解释文档就好了,否则会产生误导。

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2018-03-09
      • 1970-01-01
      相关资源
      最近更新 更多