【问题标题】:Get android:padding attribute programmatically以编程方式获取 android:padding 属性
【发布时间】:2020-05-27 23:04:46
【问题描述】:

从一个角度来看,如何以编程方式获取 android:padding 属性的值?我目前正在使用:

private static final String ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android";
private static final String ATTRIBUTE_PADDING = "padding";

public ActivityWrapperView(Context context, AttributeSet attrs) {
    super(context, attrs);
    int padding = attrs.getAttributeIntValue(ANDROID_NAMESPACE, ATTRIBUTE_PADDING, -1);
}

这返回-1,我也尝试使用“android:padding”作为属性名,但仍然返回-1。

编辑:我的要求:在布局 XML 中指定 android:padding 值时,视图将使用此填充。如果未指定填充,它将使用默认填充

【问题讨论】:

    标签: android


    【解决方案1】:

    最简单的方法是使用 android.R.styleable,如果它已经可用的话。它用于获取自定义属性的方式相同。 R.styleable 是一个包含属性值的 int 数组的类。 所以你需要创建你自己的 int 数组,里面包含你需要的 int 属性值。

    public ActivityWrapperView(Context context, AttributeSet attrs) {
        super(context, attrs);
    
        //check attributes you need, for example all paddings
        int [] attributes = new int [] {android.R.attr.paddingLeft, android.R.attr.paddingTop, android.R.attr.paddingBottom, android.R.attr.paddingRight}
    
        //then obtain typed array
        TypedArray arr = context.obtainStyledAttributes(attrs, attributes);
    
        //and get values you need by indexes from your array attributes defined above
        int leftPadding = arr.getDimensionPixelOffset(0, -1);
        int topPadding = arr.getDimensionPixelOffset(1, -1);
    
        //You can check if attribute exists (in this examle checking paddingRight)
        int paddingRight = arr.hasValue(3) ? arr.getDimensionPixelOffset(3, -1) : myDefaultPaddingRight;
    
    
    }
    

    根据@Eselfar 的评论进行编辑:
    不要忘记释放 TypedArray: arr.recycle()

    【讨论】:

    • getPadding*() 不是已经在构造函数中可用了吗? * 在 { 左、右、上、下、开始、结束 }
    • 别忘了释放 TypedArray:arr.recycle();
    • 在 android.R.attr 中,cardCornerRadius 不存在。如何解决?
    【解决方案2】:

    您可以将android:padding 添加到自定义视图的属性中。

    <declare-styleable name="ActivityWrapperView">
        ...
        <attr name="android:padding" />
        ...
    </declare-styleable>
    

    然后,您可以像访问其他属性一样访问该属性:

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActivityWrapperView);
    float padding = a.getDimension(R.styleable.ActivityWrapperView_android_padding, 0);
    ...
    boolean hasPadding = a.hasValue(R.styleable.ActivityWrapperView_android_padding);
    

    【讨论】:

    • 自定义视图添加android:前缀属性真的可以吗?
    • @milosmns 当您希望能够在自定义视图上设置此属性并且您还希望自动完成以显示 Android 的内置值而不必复制/粘贴 attrs.xml 中的每个值。
    【解决方案3】:

    您应该查看getPadding____() 函数。

    大小、内边距和边距

    ...

    要测量其尺寸,视图会考虑其填充。这 填充以像素表示,用于左、上、右和下 视图的一部分。填充可用于偏移内容 查看特定数量的像素。例如,左填充 2 将视图的内容向左推 2 个像素 边缘。可以使用 setPadding(int, int, int, int) 或 setPaddingRelative(int, int, int, int) 方法和通过调用查询 getPaddingLeft()、getPaddingTop()、getPaddingRight()、 getPaddingBottom()、getPaddingStart()、getPaddingEnd()。

    即使视图可以定义填充,它也不提供任何 支持边距。但是,视图组提供了这样的支持。 请参阅 ViewGroup 和 ViewGroup.MarginLayoutParams 了解更多信息 信息。

    【讨论】:

    • 请看我的编辑,我需要属性的值,而不是填充
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多