删除所有溢出其父边界的子项

Remove all children overflowed of their parent bounds

在一个特殊的 android 应用程序中,如果整个或部分子视图溢出了他们的父边界(window 焦点已更改),我想从他们的父视图中删除所有子视图。

我尝试编写有关子项和父项宽度的手动计算,但我正在寻找适用于所有类型视图的面向对象的解决方案。

这可能是最简单的方法,只需扩展您正在使用的 ViewGroup 并在布局后删除视图。 (视图组包括 LinearLayoutRelativeLayout、...)

通过覆盖 onLayout,您可以遍历 children 并删除任何边界不在其 parent 范围内的视图。

注意事项:这可能会触发另一个布局调用,所以一定要妥善处理。

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    // call super to layout children and have their bounds set
    super.onLayout(changed, left, top, right, bottom);

    // Iterate over all children
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        if (child.getLeft() < left
                // ... add top / bottom
                || child.getRight() > right) {
            removeView(child);
        }
    }
}

如果您想在不扩展 ViewGroup 的情况下处理事情,您总是可以在布局视图后使用相同的原则来处理事情。