我正在创建一些自定义组件,我希望有一个默认的填充集,但如果需要,还可以通过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中没有指定这样的填充,则使用默认填充?
答案 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()
}