18

从一个角度来看,如何以编程方式获取 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 值时,视图将使用此填充。如果未指定填充,它将使用默认填充

4

3 回答 3

21

最简单的方法是使用 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()

于 2013-09-20T09:09:26.430 回答
6

您只需将 添加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);
于 2014-09-22T20:18:23.250 回答
2

你应该看看getPadding____()函数。

大小、填充和边距

...

为了测量其尺寸,视图会考虑其填充。对于视图的左侧、顶部、右侧和底部,填充以像素表示。填充可用于将视图的内容偏移特定数量的像素。例如,left padding 为 2 会将视图的内容推到左边缘右侧 2 个像素。可以使用 setPadding(int, int, int, int) 或 setPaddingRelative(int, int, int, int) 方法设置填充,并通过调用 getPaddingLeft()、getPaddingTop()、getPaddingRight()、getPaddingBottom()、getPaddingStart( )、getPaddingEnd()。

尽管视图可以定义填充,但它不提供对边距的任何支持。但是,视图组提供了这样的支持。有关详细信息,请参阅 ViewGroup 和 ViewGroup.MarginLayoutParams。

于 2013-08-09T06:32:52.523 回答