以编程方式和通过 xml 设置填充

Setting padding programmatically and through xml

我正在创建一些自定义组件,我想要一个默认的填充集,但如果需要,也可以通过 xml 对其进行配置。

例如:

具有默认填充的简单自定义 TextView 组件:

class MyComponent @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : TextView(context, attrs, defStyle) {

init {
        layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)

        val verticalPadding = resources.getDimension(R.dimen.FourDp).toInt()
        val horizontalPadding = resources.getDimension(R.dimen.FourDp).toInt()
        setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding)
    }
}

此组件将作为以下内容放入应用程序中:

<com.example.components.MyComponent
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="padding test"
                    <!-- setting padding is optional --> 
                    android:paddingTop="32dp"/>

问题

Android 目前忽略了通过 xml 设置的 32dp 的填充,并与组件的 init 方法中的四个 dp 的填充一起使用。有没有办法让 Android 使用 xml 中设置的填充(如果存在),如果 xml 中未指定此类填充,则使用默认填充?

您可以使用 obtainStyledAttributes 检索 XML 属性,并使用 hasValue 检查索引处是否有属性。

init {
  layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)

  val verticalPadding = resources.getDimension(R.dimen.FourDp).toInt()
  val horizontalPadding = resources.getDimension(R.dimen.FourDp).toInt()

  val attributes = intArrayOf(android.R.attr.paddingLeft, android.R.attr.paddingTop,
      android.R.attr.paddingBottom, android.R.attr.paddingRight)

  val arr = context.obtainStyledAttributes(attrs, attributes)

  // determine if paddingTop is set if not, use verticalPadding 
  val paddingRight = if (arr.hasValue(android.R.attr.paddingTop))
    arr.getDimensionPixelOffset(android.R.attr.paddingTop, -1)
  else
    verticalPadding

  // setPadding

  arr.recycle()
}