原文链接: Android自定义View使用系统自有属性 - Stars-One的杂货小窝
本篇默认各位有自定义View的相关知识,本篇只作为一个小知识点补充
有这样一种情况,比如说我们的一个自定义View中有个maxLines的属性,但是我们会注意到这个maxLines其实Android里面已经存在了(如TextView中),我们能否直接去复用此属性呢?
实现的效果实际就是把代码里我们之前的属性引用写的
app:maxLInes
改为了android:maxLines
答案是可以的,那么应该如何操作呢?,如下代码
class FlowLayout : ViewGroup {
constructor(context: Context, attr: AttributeSet) : super(context, attr) {
//注意这里这里的obtainStyledAttributes的第二个参数,数一个int数组(需要有个属性数值,且数组长度为1)
//如果要想使用多个,就像下面那样再写一次
context.obtainStyledAttributes(attr, intArrayOf(android.R.attr.maxLines)).apply {
//取值类型得看对应属性定义的类型
val maxLine = getInt(0, Int.MAX_VALUE)
Log.d("starsone", "maxLine: $maxLine ")
recycle()
}
context.obtainStyledAttributes(attr, intArrayOf(android.R.attr.maxRows)).apply {
//这里
val maxRow = getInt(0, Int.MAX_VALUE)
Log.d("starsone", "maxRow: $maxRow ")
recycle()
}
}
之后在xml中使用 (这里注意是android前缀而不是app前缀):
<com.example.myapplication.view.FlowLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/flowlayout"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
+ android:maxLines="10"
+ android:maxRows="11"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FlowLayoutTestActivity">
/>
PS: 不过这个方法有个缺陷,就是在xml中写的时候不会有对应属性的代码提示...