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

时间:2017-12-22 20:39:11

标签: android xml android-layout kotlin android-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中没有指定这样的填充,则使用默认填充?

1 个答案:

答案 0 :(得分:1)

您可以使用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()
}