如何忽略父视图的填充?

时间:2021-04-15 12:30:19

标签: android android-layout

我有具有子视图的 ScrollView 布局(或其他不重要的布局类型)。而这个父布局有 paddingLeftpaddingRight。我想为每个孩子设置这个填充,但有时我有例外,我希望那个孩子完全到达显示器的边缘(例如带有背景颜色的 TextView)。有什么办法可以让这种情况发生吗?我不想分别为每个孩子设置填充。

1 个答案:

答案 0 :(得分:0)

您告诉我们您想要什么:“有时子级不应该尊重其父级填充”,因此特殊行为应该发生在子级上。

解决方案是 EXTEND Child 的主视图,它默认选择其 MARGIN,然后创建一个“Child.setNoMargins()”方法,在需要时将它们从自身中删除。

public static class ExtendedTextView extends TextView {
    
    private boolean mHasNoMargins = false;

    public ExtendedTextView(Context context) {
        super(context);
    }
    
    public void setNoMargins() {
        mHasNoMargins = true;
        if (!isInLayout() && isAttachedToWindow()) requestLayout();
    }

    @Override
    public void setLayoutParams(ViewGroup.LayoutParams params) {
        if (!mHasNoMargins && (params instanceof ViewGroup.MarginLayoutParams)) {
            ((ViewGroup.MarginLayoutParams)params).setMarginStart(20);
            ((ViewGroup.MarginLayoutParams)params).setMarginEnd(20);
        }
        super.setLayoutParams(params);
    }
}

通过这种方式,所有创建的“ExtendedTextView”都有默认的左/右边距,直到您调用“setNoMargins()”。 显然,我的代码仅在父 ViewGroup 支持具有边距(其中大部分)的 LayoutParams 时才有效。