博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Andriod: 在xml布局中使用自定义属性
阅读量:5066 次
发布时间:2019-06-12

本文共 4145 字,大约阅读时间需要 13 分钟。

今天在看android froyo的launcher2 源码的时候,在launcher.xml中看到有这么一段代码:

注意到其中的两处:

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

launcher:defaultScreen="2"

可以看出在这个布局文件中,使用了自定义属性。

 

以前没遇到过,既然这里碰到了,就顺便学习下,下面就写个简单的示例,权当学习笔记,便于以后查阅。

1. 定义一些自定义属性

建立一个属性xml文件: values/attrs.xml, 内容如下:

解释如下:

属性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:

可以看到我们在这个布局文件中加入了一个新的命名空间:

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);    }}

运行效果:

转载于:https://www.cnblogs.com/hibraincol/archive/2011/10/27/2227149.html

你可能感兴趣的文章
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>