代码之家  ›  专栏  ›  技术社区  ›  Martin

如何忽略父视图的填充?

  •  0
  • Martin  · 技术社区  · 3 年前

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

    0 回复  |  直到 3 年前
        1
  •  0
  •   emandt    3 年前

    你告诉我们你想要什么:” 有时,孩子不应该尊重父母的填充 “,所以这种特殊行为应该发生在儿童身上。

    解决方案是EXTEND Child的主视图,默认情况下,它在主视图中选择其边距,然后创建一个“ 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(其中大多数)时才能工作。