android源生相册,使用Android源生解析xml文件

TypedArray相信大家都不陌生,他用于android自定义View中对自定义属性的解析。他的方便之处在于可以直接将例如@drawable/test_drawable这样的图片直接解析成一个Drawable对象,又可以将10dp这样的单位,在代码中直接拿到换算好的px值,方便之处不言而喻。

ok,现在问题来了,如果我只想用一个xml文件作为我一个模块的配置文件,又不想自己去pull解析xml,去解析哪些dp,reference的字符串,该怎么办呢?

废话结束。

首先在values文件夹下创建attrs.xml文件用来编写约束的描述

然后在xml文件夹下创建被约束的配置文件test.xml

aaa:key="key_test"

aaa:vercode="1002"

aaa:background="@drawable/bubble"

aaa:height="100dp"

aaa:width="200dp"

>

最后就可以在代码中获取这些数据了

public static void parse(Context context, int resourceId){

TypedArray typedArray = getTypedArrayFromResource(context, resourceId, R.styleable.guide, "test");

if(typedArray == null){

return null;

}

String key = typedArray.getString(R.styleable.test_attrs_key);

int vercode = typedArray.getInteger(R.styleable.test_attrs_vercode, 0);

Drawable background = typedArray.getDrawable(R.styleable.test_attrs_background);

int height = typedArray.getInteger(R.styleable.test_attrs_height, 0);

int width = typedArray.getInteger(R.styleable.test_attrs_width, 0);

if(typedArray != null){

typedArray.recycle();

}

//TODO do something you want

}

/**

* 通过xml资源文件、其对应的attrs约束文件,获取对应TypedArray

* 记得用完要释放。

* @param context

* @param resourceId xml资源id

* @param attributeSchema attrs约束定义文件id

* @param tagName 需要解析的标签名称

* @return

*/

@SuppressLint("Recycle")

private static TypedArray getTypedArrayFromResource(Context context, int resourceId, int[] attributeSchema, String tagName){

TypedArray typedArray = null;

try {

if(context == null){

throw new Exception("Context is null in GuiderFactory, cannot fetch TypedArray.");

}

Resources resource = context.getResources();

if(resource == null){

throw new Exception("Resource is null in GuiderFactory, cannot fetch TypedArray.");

}

XmlResourceParser parser = resource.getLayout(resourceId);

if(parser == null){

throw new Exception("Parser is null in GuiderFactory, cannot fetch TypedArray.");

}

AttributeSet attributeSet = null;

int state = 0;

do {

if (state == XmlPullParser.START_TAG && parser.getName().equals(tagName)) {

attributeSet = Xml.asAttributeSet(parser);

break;

}

} while(state != XmlPullParser.END_DOCUMENT);

if(attributeSet == null){

throw new Exception("AtrributeSet is null in GuiderFactory, cannot fetch TypedArray.");

}

typedArray = context.obtainStyledAttributes(attributeSet, attributeSchema);

}catch (Exception e) {

e.printStackTrace();

}

return typedArray;

}

其实就是将没用的标签过滤掉没用的标签,拿到想要的标签对象。然后生成 AttributeSet, 就可以像在自定义view的构造方法中那样obtain一个TypedArray了。至于其中源码的分析以后有时间再写。最后把attrs可以定义的几种format写一下。

reference  资源引用

string字符串

color颜色值,可以直接获取到Color

boolean布尔值

demension像素值,自动获取本机的对应demention并且换算为px

float浮点

integer整型

fraction百分数,这个说一下,用在animation的定义上,rotateanimation中的属性pivotX="50%"

enum枚举。写法为

flag位或运算。其实就是枚举是单选,位或运算可以是多选。写法如下

                     /**.......*/                     

这样用户在设置的属性的时候可以设置

stateUnspecified |

stateUnchanged,与或非用好了真心能解决不少问题。今天就到这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值