android自定義view之自定義屬性

這兩天在Android中用到了自定義view,在自定義view時(shí)也順便使用了下自定義屬性。自定義屬性以前只是耳聞 未曾謀面,這次借機(jī)會(huì)對(duì)自定義屬性進(jìn)行了一番學(xué)習(xí),順便總結(jié)了一下自定義屬性的使用。
下面掃盲班老司機(jī)要開車了,小白快刷卡上車,大神拒載。


老司機(jī)

Android中經(jīng)常用到自定義view,既然用了自定義view那就不得不提自定義屬性。你是否思考過為什么我們?cè)趚ml文件中進(jìn)行布局時(shí)可以直接通過android:layout_width="match_parent"就可以設(shè)置控件的寬度呢?不只是寬度,幾乎控件的所有屬性都可以在xml文件中進(jìn)行設(shè)置,這是怎樣實(shí)現(xiàn)的呢,this is a question

TextView部分屬性

我們自定義view時(shí)能不能也像系統(tǒng)提供的控件一樣在xml文件中設(shè)置屬性呢。答案是當(dāng)然可以了,用到的就是今天要說的自定義屬性。廢話不多說 直接開干。
1,首先在res 的values文件夾下新建一個(gè)attrs.xml文件,就是這樣


新建的attrs.xml文件

2,開始編寫我們需要的屬性。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="burce">
        <attr name="mHeight" format="integer"/>
        <attr name="mWidth" format="integer"/>
        <attr name="mName" format="string"/>
        <attr name="sex" format="enum">
            <enum name="man" value="0"/>
            <enum name="woman" value="1"/>
        </attr>
        <attr name="student" format="boolean"/>
    </declare-styleable>
</resources>

說一下用到的東西
<declare-styleable name="burce">其中的name的值隨便定義一個(gè),不要與系統(tǒng)的起沖突。
<attr name="mHeight" format="integer"/>name就是自定義的屬性的名字(比如系統(tǒng)控件的android:layout_width) format 就是屬性的類型,這里支持10種類型,常用的有string,integer,boolean等等,這次我們用到了整形,枚舉和布爾
注意:我們?cè)谧远x屬性的名字的時(shí)候不能與系統(tǒng)的名字沖突,否則會(huì)報(bào)錯(cuò)

3,新建一個(gè)類繼承View類,實(shí)現(xiàn)3個(gè)構(gòu)造方法,然后獲取我們自定義的屬性

public class MyView extends View {
    private static final String TAG = "MyView";
    private int heiget;
    private int width;
    private String name;
    private int sex;
    private boolean student;
    public MyView(Context context) {
        this(context,null);
    }

    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.burce);
        heiget=array.getInt(R.styleable.burce_mHeight,0);
        width=array.getInt(R.styleable.burce_mWidth,0);
        name=array.getString(R.styleable.burce_mName);
        sex=array.getInt(R.styleable.burce_sex,0);
        student=array.getBoolean(R.styleable.burce_student,true);
        array.recycle();

        Log.i(TAG, "height: "+heiget);
        Log.i(TAG, "width: "+width);
        Log.i(TAG, "name: "+name);
        Log.i(TAG, "sex: "+sex);
        Log.i(TAG, "student: "+student);

    }
}

TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.burce);

Android Developers

這是Google官方給的解釋,就簡(jiǎn)單說一下兩個(gè)參數(shù)怎么填吧,第一個(gè)填形參的attrs,第二個(gè)填 R.styleable是固定寫法,bruce是<declare-styleable name="burce">中的name的值。
4,回到MainActivity的布局文件中使用我們的自定義view

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.myviewtest.MainActivity">
    <com.myviewtest.MyView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:mName="bruce"
        app:sex="man"
        app:mHeight="100"
        app:mWidth="100"
        app:student="true"/>
</RelativeLayout>

注意:如果Android studio沒有加上命名空間的話需要自己加上xmlns:app="http://schemas.android.com/apk/res-auto" 只有聲明了命名空間才能使用自定義屬性,不懂啥是命名空間的同學(xué)呢自己Google學(xué)習(xí)一下吧(最近在學(xué)C++,我就安C++中的命名空間理解的,如果不正確還請(qǐng)大神賜教)
<attr name="height" format="integer"/> 這里的我們?cè)谶@用了app命名空間,所有所有的自定義屬性的開頭都加上了“app:”。

準(zhǔn)備工作都做好了接下來(lái)我們吧應(yīng)用跑起來(lái)看看吧,這里我們通過打印log查看自定義屬性的值。

運(yùn)行結(jié)果

通過log可以得知 我們?cè)谧远xview中成功的獲取到了屬性的值。好的老司機(jī)平安到站,小白有序下車。
由于你遇到了一個(gè)假的老司機(jī),文章中如果有不正確的地方還請(qǐng)各位大神在評(píng)論區(qū)指正,老司機(jī)在這里抱拳了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容