Android--自訂屬性

來源:互聯網
上載者:User

標籤:

最近在學習一個開源的項目,看到人家定義的資源檔有如下標籤:

而在該項目中,利用以上路徑追溯下去,會追溯到這麼一個類檔案,所以就迷糊了,定義布局檔案跟類有毛關係<比較二>查了下

原來是自訂屬性的使用!

------------------------------------------------------------------------------------------------------------------------

先看一張關係圖:

 

其實就是,在values目錄下定義一個attrs.xml,在對應的類檔案裡產生某些組件,在layout布局檔案裡為這些屬性賦值

引用牛人一個例子:

attrs.xml

 
<?xml version="1.0" encoding="utf-8"?><resources>        <attr name="test1" format="string" />      <declare-styleable name="MyView">              <attr name="textColor" format="color" />                <attr name="textSize" format="dimension" />                <attr name="text" format="string" />        </declare-styleable>  </resources>

解釋:

 
attr子項目:定義具體的屬性,format表示這個屬性的值的類型,類型有以下幾種:     1.reference:參考指定Theme中資源ID,這個類型意思就是你傳的值可以是引用資源     2.string:字串,如果你想別人既能直接寫值也可以用類似"@string/test"引用資源的方式,可以寫成format="string|reference"     3.Color:顏色     4.boolean:布爾值     5.dimension:尺寸值     6.float:浮點型     7.integer:整型     8.fraction:百分數     9.enum:枚舉 ,如果你提供的屬性只能讓別人選擇,不能隨便傳入,就可以寫成這樣        <attr name="language">                   <enum name="china" value="1"/>                   <enum name="English" value="2"/>            </attr>     10.flag:位或運算declare-styleable子項目:定義一個styleable對象,每個styleable對象就是一組attr屬性的集合 注意:這裡的name屬性並不是一定要和自訂類名相同,只是為了好區分對應類的屬性而已注意:上面的屬性資源檔定義了該屬性之後,至於到底是哪個自訂View組件中來使用該屬性,該屬性到底能發揮什麼作用, 就不歸該屬性資源檔管了,也就是說這個屬性資源檔是個公用的,大家都可以用,但是為了方便管理,一般都是一個自訂View裡的屬性寫成一個declare-styleable集合.屬性資源所定義的屬性到底可以返回什麼作用,取決於自訂群組件的代碼實現

3、定義組件類

 
package cn.com.androidtest.ui;import cn.com.androidtest.R;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;public class MyView extends View{     private Paint mPaint;       private Context mContext;       private static String mString;     private String test;           public MyView(Context context)     {            super(context);              mPaint = new Paint();      }          public MyView(Context context,AttributeSet attrs)      {              super(context,attrs);              mPaint = new Paint();                              /*這裡取得declare-styleable集合*/             TypedArray typeArray = context.obtainStyledAttributes(attrs,R.styleable.MyView);                    /*這裡從集合裡取出相對應的屬性值,第二參數是如果使用者沒用配置該屬性時所用的預設值*/            int textColor = typeArray.getColor(R.styleable.MyView_textColor,0XFFFFFFFF);              float textSize = typeArray.getDimension(R.styleable.MyView_textSize, 36);              mString = typeArray.getString(R.styleable.MyView_text);             /*設定自己的類成員變數*/            mPaint.setTextSize(textSize);              mPaint.setColor(textColor);              /*關閉資源*/            typeArray.recycle();      }      @Override      protected void onDraw(Canvas canvas)     {           super.onDraw(canvas);           mPaint.setStyle(Style.FILL);                 canvas.drawRect(new Rect(10, 10, 90, 90), mPaint);                 mPaint.setColor(Color.BLUE);            canvas.drawText(mString, 10, 110, mPaint);      }  }

 

4、布局檔案引用賦值

 
<?xml version="1.0" encoding="utf-8"?><LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:myandroid="http://schemas.android.com/apk/res/cn.com.androidtest"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><TextView      android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="@string/hello"/>        <cn.com.androidtest.ui.MyView         android:layout_width="fill_parent"          android:layout_height="wrap_content"          myandroid:textColor="#ff0000"         myandroid:textSize="20px"         myandroid:text="http://wujiandong.iteye.com"/></LinearLayout>

注意:

java代碼裡那種取屬性值的方式,那麼在XML使用該組件的時候一定要為該自訂群組件設定一個命名空間[xmlns:myandroid="http://schemas.android.com/apk/res/cn.com.androidtest"],不然組件屬性設定不了 
命名空間寫法:xmlns:空間名="http://schemas.android.com/apk/res/自訂群組件所在包名" 
寫包名時候也有個要注意的地方: 
如果你的自訂View所在包類似如下兩圖,那麼包名只能寫成最頂層包[cn.com.androidtest],而不能是[cn.com.androidtest.ui] 

包試圖:

 

詳細進入大牛部落格:點擊查看

Android--自訂屬性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.