在维护一个 android 组件的 activity 组件的时候遇到一个小需求,不同 APP 引用这个组件需要不同的部分显示,如 TextView ,ImageView,还有改变 text 的颜色,于是牵扯到怎么将参数传递到 AndroidManifest.xml 的 Activity 中…
这里 meta-data 有两种放置方法:
由于 Activity 是 application 的子节点于是可以将 meta-data 放至 application 下面,与 Activity 同级也可以放至 需要用的 Activity 节点下面,放到 application 下的话就全部 Activity 都能拿到这个数据,负责就只有父 Activity 可以拿到
<!-- 放置 application 下,activity1 和 activity2 都可以获取到数据 -->
<application >
<activity android:name="com.zmide.activity1"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity android:name="com.zmide.activity2"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<meta-data android:name="data1" android:value="Test" />
<meta-data android:name="data2" android:value="#1bbb63" />
</application>
<!-- 放置 activity 下,只有 activity2 都可以获取到数据 -->
<application >
<activity android:name="com.zmide.activity1"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity android:name="com.zmide.activity2"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<meta-data android:name="data1" android:value="Test" />
<meta-data android:name="data2" android:value="#1bbb63" />
</activity>
</application>
放置不同位置我们获取数据的对象也有点不太相同,application 下使用 ApplicationInfo
try {
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(this.getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = appInfo.metaData;
String data1 = bundle.getString("data1");
String data2 = bundle.getString("data2");
if(data1 != null){
Log.d("测试",data1);
}
if(data2 != 0){
Log.d("测试",data2);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
如果放置在 activity 节点下的话需要使用 ActivityInfo
try {
ActivityInfo appInfo = getPackageManager().getActivityInfo(this.getComponentName(),
PackageManager.GET_META_DATA);
Bundle bundle = appInfo.metaData;
String data1 = bundle.getString("data1");
int data2 = bundle.getInt("data2");
if(data1 != null){
Log.d("测试",data1);
}
if(data2 != 0){
Log.d("测试",data2);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
从 Bundle 取数据的话有 getString(),getInt(),getBoolean(),getFloat()
这里值得注意的是传颜色值 #669966 使用的也是 getInt(),取到的颜色数值就可以直接使用了
findViewById(R.id.text).setTextColor(Bundle.getInt("data2"));
也可以直接传入资源 ID
<meta-data android:name="app_name"
android:resource="@string/appname" />
当然取到的资源 ID 是不能直接使用的,需要 getResource.get... 去获取一下
try {
ActivityInfo activityInfo = getPackageManager().getActivityInfo(getComponentName(),
PackageManager.GET_META_DATA);
// 获取到的是 @string/appname 对应的资源id值
int value = activityInfo.metaData.getInt("app_name");
Log.d("Activity Tag", "resource_id : " + value);
String[] aString = getResources().getStringArray(value);
for (int i = 0; i < aString.length; i++) {
Log.i(TAG, "onCreate: " + aString[i]);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
好像没啥可以写的了,好叭……今天的坑就踩到这 ( ^_^ )/~~