[Android记录]meta-data小结

http://my.oschina.net/xesam/blog/135333

概念

meta-data就像其名一样,主要用来定义一些组件相关的配置值。

按照官方定义,metadata是一组供父组件使用的名值对(name-value pair),因此相应的meta-data元素应该定义在相应的组件中。即如果想在activity中使用metadata,那么meta-data必须定义在AndroidManifest.xml的activity声明中。

使用

所有的名值对被包装成Bundle供组件使用,因此使用方式同Bundle。metadata普通值由value属性给出,资源ID由resource属性给出。
比如我们定义资源

1 <string name="x_key">resource key</string>
2 //R
3 public static final int ic_launcher=0x7f020000;
定义metadata


1 <meta-data
2     android:name="com.xesam.key_1"
3     android:value="x_key" />
4 <meta-data
5     android:name="com.xesam.key_2"
6     android:value="@string/x_key" />
7 <meta-data
8     android:name="com.xesam.img"
9     android:resource="@drawable/ic_launcher" />

那么有:

1 metadata.getString("com.xesam.key_1") ==> "x_key"
2 metadata.getString("com.xesam.key_2") ==> "resource key"
3 metadata.getInt("com.xesam.img")      ==> 0x7f020000
由于resource指向资源ID,因此用metadata可以定义一些稍微复杂的值。 
比如要定义一副图片,则可以用这个,然后在代码中用getInt()取出图片的ID:
1 int imageId = meta.getInt("com.xesam.img");
2 ((ImageView) findViewById(R.id.img)).setImageResource(imageId);

使用问题

形如:

1 <meta-data
2     android:name="com.xesam.key_1"
3     android:value="000" />
类似这样的值如果使用bundle.getString()的话是不起作用的,因为Bundle中使用的是形如: 
1 return (String) o;

的代码获取一个StringValue值的,但是在将metadata包装成bundle的时候,"000"被解析成整数0, 
因此bundle.getString("com.xesam.key_1")返回的是(String)0,显然,java是不允许这样的,因此最后得到的是null。 话说android为什么不是用String.valueOf()或者obj.toString()呢?

为了避免这种情况:
1,可以在形如000的字符串前面放个\0空字符,强迫android按照字符串解析000。
2,在资源文件中指定需要的值,然后在metadata的value中引用此值。

示例代码

附:

01 //在Activity应用<meta-data>元素。
02     ActivityInfo info = this.getPackageManager()
03             .getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
04     info.metaData.getString("meta_name");
05
06     //在application应用<meta-data>元素。
07     ApplicationInfo appInfo = this.getPackageManager()
08             .getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
09     appInfo.metaData.getString("meta_name");
10
11     //在service应用<meta-data>元素。
12     ComponentName cn = new ComponentName(this, MetaDataService.class);
13     ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
14     info.metaData.getString("meta_name");
15
16     //在receiver应用<meta-data>元素。
17     ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
18     ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
19     info.metaData.getString("meta_name");


meta-data官方地址 http://developer.android.com/reference/android/os/Bundle.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值