以编程方式和通过 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()
}
我正在创建一些自定义组件,我想要一个默认的填充集,但如果需要,也可以通过 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()
}