1. 程式人生 > 其它 >Android自定義View的自定義屬性

Android自定義View的自定義屬性

使用案列

layout.xml
<com.example.rx_demo.MyView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:flag="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="flag" format="boolean" />
    </declare-styleable>
</resources>

自定義View取值
val typedArray = context.obtainStyledAttributes(attrs,R.styleable.MyView)
val flag = typedArray.getBoolean(R.styleable.MyView_flag,true)
typedArray.recycle()

attrs是實現了一個xml解析器,可以通過它獲取

<com.example.rx_demo.MyView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:flag="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

裡面所有值

看看R.txt檔案,關於自定義view屬性的東西

int[] styleable MyView { 0x7f030378 }
int styleable MyView_flag 0
int attr flag 0x7f030378

實際上等價於
int[] styleable MyView { flag }
int styleable MyView_flag 0

由此可知R.styleable.MyView是一個數組,裡面有一個flag的屬性
我們可以通過這個陣列過濾出我們想要的屬性值,丟進陣列
而R.styleable.MyView_flag是一個下標值,可以通過下標值拿到屬性