Andriod: 在xml布局中使用自定义属性

前端之家收集整理的这篇文章主要介绍了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
"@+id/workspace"
"match_parent"
"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 "icon_left" value "0" />
"icon_right" "1" />
"icon_above" />
"icon_below" "3" />
</ attr >
skip />
declare-styleable "IconText" >
/>
"icon" format "reference" />
"text" "string" />
"text_size" "dimension" />
"text_color" "integer" />
"space" />
declare-styleable >
>

解释如下:

属性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;
android.content.res.TypedArray;
android.util.AttributeSet;
android.util.Log;
android.widget.ImageView;
android.widget.LinearLayout;
android.widget.TextView;
public class IconTextView extends LinearLayout {
private final static String TAG = "IconTextView" ;
int ICON_LEFT = 0 ;
ICON_RIGHT = 1 ;
ICON_ABOVE = 2 ;
ICON_BELOW = 3 ;
private TextView mTextView;
ImageView mImageView;
mRelation = ICON_LEFT;
String mText = "" ;
mIconId;
float mTextSize;
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);
"mText: " +mText);
mTextSize = a.getDimensionPixelSize(R.styleable.IconText_text_size, 12 );
"mTextSize: " +mTextSize);
mSpace = a.getDimensionPixelSize(R.styleable.IconText_space,0)!important">5 );
"mSpace: " +mSpace);
mIconId = a.getResourceId(R.styleable.IconText_icon,R.drawable.icon);
"mIconId: " +mIconId);
a.recycle();
mTextView = new TextView(context);
mTextView.setText(mText);
mTextView.setTextSize(mTextSize);
mImageView = ImageView(context);
mImageView.setImageResource(mIconId);
left = ;
top = ;
right = ;
bottom = ;
orientation = HORIZONTAL;
textViewIndex = ;
switch (mRelation){
case ICON_ABOVE:
orientation = VERTICAL;
bottom = mSpace;
;
break ;
ICON_BELOW:
orientation = VERTICAL;
top = mSpace;
;
ICON_LEFT:
right = mSpace;
;
;
ICON_RIGHT:
left = mSpace;
;
}
this .setOrientation(orientation);
.addView(mImageView);
mImageView.setPadding(left,top,right,bottom);
.addView(mTextView,textViewIndex);
}
}

可以看出这个LinearLayout 子类IconTextView中只有两个元素,ImageView 和mTextView,通过从xml配置文件中读取属性值来决定icon和text的内容、相对位置及其它属性

3. 在layout布局文件中使用这个自定布局及其属性

layout/main.xml:

LinearLayout android:orientation "vertical"
"fill_parent"
"fill_parent"
>
com.braincol.viewattrs.IconTextView
"@+id/icontext_01"
"http://schemas.android.com/apk/res/android"
xmlns:icontext "http://schemas.android.com/apk/res/com.braincol.viewattrs"
"wrap_content"
"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中使用该布局

android.app.Activity;
android.os.Bundle;
ViewAttrs Activity {
/** Called when the activity is first created. */
@Override
void onCreate(Bundle savedInstanceState) {
.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

猜你在找的XML相关文章