Andriod: 在xml佈局中使用自定義屬性

轉載:http://www.cnblogs.com/hibraincol/archive/2011/10/27/2227149.html

今天在看android froyo的launcher2 源碼的時候,在launcher.xml中看到有這麼一段代碼:

?
<com.android.launcher2.DragLayer
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
 
    android:id="@+id/drag_layer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <include layout="@layout/all_apps" />
 
    <!-- The workspace contains 3 screens of cells -->
    <com.android.launcher2.Workspace
        android:id="@+id/workspace"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="horizontal"
        android:fadeScrollbars="true"
        launcher:defaultScreen="2">

注意到其中的兩處:

xmlns:launcher=”http://schemas.android.com/apk/res/com.android.launcher”

launcher:defaultScreen="2"

可以看出在這個佈局文件中,使用了自定義屬性。

 

以前沒遇到過,既然這裏碰到了,就順便學習下,下面就寫個簡單的示例,權當學習筆記,便於以後查閱。

1. 定義一些自定義屬性

建立一個屬性xml文件: values/attrs.xml, 內容如下:

?
<?xml version="1.0" encoding="utf-8" ?>
<resources>
    <!-- the relation between the icon and text. -->
    <attr name="relation">
        <enum name="icon_left"     value="0" />
        <enum name="icon_right"    value="1" />
        <enum name="icon_above"    value="2" />
        <enum name="icon_below"    value="3" />
    </attr>
     
    <skip />
     
    <declare-styleable name="IconText">
         <attr name="relation" />
         <attr name="icon"         format="reference" /> 
         <attr name="text"         format="string" />
       <attr name="text_size"     format="dimension" />
       <attr name="text_color"    format="integer" />
       <attr name="space"         format="dimension" />
    </declare-styleable>
     
</resources>

解釋如下:

屬性relation有4種可選值:icon_left, icon_right, icon_above,icon_below.

屬性icon的可選值爲引用: 例如:"@/drawbable/icon".

屬性text的可選值爲string, 例如: "Hello world", 也可是string的引用"@string/hello".

屬性text_size的可選值爲尺寸大小,例如:20sp、18dip、20px等.

屬性text_color的可選值爲整數,例如:"0xfffffff", 也可以是color的引用"@color/white".

 

2. 定義一個能夠處理這些屬性值的view或者layout類

?
package com.braincol.viewattrs;
 
 
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class IconTextView  extends LinearLayout {
    private final static String TAG = "IconTextView";
    private final int ICON_LEFT = 0;
    private final int ICON_RIGHT = 1;
    private final int ICON_ABOVE = 2;
    private final int ICON_BELOW = 3;
 
    private TextView mTextView;
    private ImageView mImageView;
 
    private int mRelation = ICON_LEFT;
    private String mText = "";
    private int mIconId;
    private float mTextSize;
    private int mSpace;
 
    public IconTextView(Context context, AttributeSet attrs){
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IconText);
 
        mRelation = a.getInt(R.styleable.IconText_relation, ICON_LEFT);
        Log.d(TAG,"mRelation: "+mRelation);
 
        mText = a.getString(R.styleable.IconText_text);
        Log.d(TAG,"mText: "+mText);
 
        mTextSize = a.getDimensionPixelSize(R.styleable.IconText_text_size, 12);
        Log.d(TAG,"mTextSize: "+mTextSize);
 
        mSpace = a.getDimensionPixelSize(R.styleable.IconText_space, 5);
        Log.d(TAG,"mSpace: "+mSpace);
 
        mIconId = a.getResourceId(R.styleable.IconText_icon, R.drawable.icon);
        Log.d(TAG,"mIconId: "+mIconId);
 
        a.recycle();
 
        mTextView = new TextView(context);
        mTextView.setText(mText);
        mTextView.setTextSize(mTextSize);
 
        mImageView = new ImageView(context);
        mImageView.setImageResource(mIconId);   
 
        int left    = 0;
        int top     = 0;
        int right    = 0;
        int bottom    = 0;
        int orientation = HORIZONTAL;
        int textViewIndex = 0;
        switch(mRelation){
        case ICON_ABOVE:
            orientation = VERTICAL;
            bottom = mSpace;
            textViewIndex = 1;
            break;
        case ICON_BELOW:
            orientation = VERTICAL;
            top = mSpace;
            break;
        case ICON_LEFT:
            right = mSpace;
            textViewIndex = 1;
            break;
        case ICON_RIGHT:
            left = mSpace;
            break;
        }
        this.setOrientation(orientation);
        this.addView(mImageView);
        mImageView.setPadding(left, top, right, bottom);
        this.addView(mTextView, textViewIndex);
    }
}

可以看出這個LinearLayout 子類IconTextView中只有兩個元素,ImageView 和mTextView,通過從xml配置文件中讀取屬性值來決定icon和text的內容、相對位置及其它屬性。

 

3. 在layout佈局文件中使用這個自定佈局及其屬性

layout/main.xml:

?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<com.braincol.viewattrs.IconTextView
    android:id="@+id/icontext_01"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:icontext="http://schemas.android.com/apk/res/com.braincol.viewattrs"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    icontext:relation="icon_left"
    icontext:icon="@drawable/hi"
    icontext:text="hi,how are you!"
    icontext:text_size="12sp"
  />
   
</LinearLayout>

可以看到我們在這個佈局文件中加入了一個新的命名空間:

xmlns:icontext="http://schemas.android.com/apk/res/com.braincol.viewattrs"   

並使用我們自定義的那些屬性:

icontext:relation="icon_left" 
icontext:icon="@drawable/hi" 
icontext:text="hi, how are you !" 
icontext:text_size="30sp" 

4. 在Activity中使用該佈局

?
package com.braincol.viewattrs;
 
import android.app.Activity;
import android.os.Bundle;
 
public class ViewAttrs extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章