天天看點

三、自定義attr屬性,指定方向

LinearLayout的orientation

orientation是支援橫向和豎向的,且是直接寫在布局裡面的,那麼我們自定義的話是怎麼來實作呢?這裡就要延伸出一個自定義屬性的東西。

使用步驟

在attr.xml裡面配置

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MineLineLayout">
        <attr name="android:orientation" format="integer">
            <enum name="horizontal" value="0" />
            <enum name="vertical" value="1" />
        </attr>
    </declare-styleable>
</resources>
           

這裡面有format的類型有如下幾個:

format類型 說明
boolean attr是布爾類型的值,取值隻能是true或false
string string類型
integer int整型(不含浮點型)
float 浮點型(包含整型)
fraction 表示百分數,隻能以%号結尾
color 代表顔色,可以使用#000000,也可以使用@color/white
dimension 代表attr是尺寸類型.px/dp/sp結尾都可
reference attr的值隻能指向某一資源的ID
enum 枚舉值,隻能取其中一個值
flag 設定多個值,支援"|"操作符,不能在attr上設定format為flag,直接在attr節點下面添加flag節點即可

在代碼裡面擷取

  1. 首先在xml裡面使用一下.
<com.jhzl.customview.MineLineLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="@color/black"
        android:layout_gravity="center">
           

這裡有個細節需要注意:

**android:orientation=“vertical”**就是我們在前面配置的attr裡面的enum.

  1. MineLineLayout擷取orientation
public MineLineLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        //擷取MineLineLayout所有attr裡面的内容
        final TypedArray a = context.obtainStyledAttributes(
                attrs, R.styleable.MineLineLayout);
        //擷取orientation
        int index = a.getInt(R.styleable.MineLineLayout_android_orientation, -1);
        if (index >= 0) {
            setOrientation(index);
        }
        //回收TypedArray
        a.recycle();
        Log.d(TAG,"orientation = "+index);
    }
           

列印結果: