如何强制元数据值键入字符串?

时间:2010-01-28 13:55:33

标签: android android-manifest

我在manifest.xml中指定了一个元数据,如下所示:

<meta-data android:value="5555555555" android:name="foo"></meta-data>

访问这样的元数据时:

ActivityInfo ai = act.getPackageManager().getActivityInfo(componentName, PackageManager.GET_META_DATA);
Object value = (Object)ai.metaData.get(key);

此值被解释为int - 更重要的是 - 错误地解释为(1260588259)。

由于类型是由构建系统自动确定的(布尔值,整数,浮点数和字符串),我想知道是否有办法强制数据类型为字符串。

我尝试在末尾添加一个空格(“5555555555”),但随后该值被解释为5.5555553E9 float! )。

我也尝试使用getString而不是get,但是返回null。

有什么想法吗? TIA。

4 个答案:

答案 0 :(得分:35)

在数字前放置一个转义空格似乎有效:

<meta-data android:name="foo" android:value="\ 1234567890"/>

转义空格不会出现在get()返回的值中。

如果我诚实的话,我不知道这是如何运作的。

如果你想要something documented因此更可靠,你总是可以把你的字符串值作为资源并引用它:

<meta-data android:name="foo" android:resource="@string/mynumber"/>

答案 1 :(得分:9)

我也有这样的问题。 我的解决方案如下:

<meta-data android:value="5555555555\0" android:name="foo"></meta-data>

我在变量的末尾添加了 - eskape序列&#34; \ 0&#34; (NULL - 通常用于定义字符串的结尾(例如,在语言C中)。

这项工作适合我。

最好的问候。

答案 2 :(得分:0)

不要使用空格,而是尝试使用一个标点符号,该标点符号应该在数字值中没有任何作用,比如冒号,看看是否有帮助。

答案 3 :(得分:0)

我最近遇到了这个问题,并且非常令人沮丧的是,像Facebook应用程序ID这样的东西被解释为一个整数,导致由于溢出导致的问题(当然)。我原以为/希望有可能覆盖隐式输入。例如,而不是:

<meta-data android:name="value" android:value="12345678901234567890" />

如果我们能写下来会很好:

<meta-data android:name="value" android:type="string" android:value="12345678901234567890" />

为了弥补这一点,我写了一些需要清单属性的支持代码,如下所示:

<meta-data android:name="value1" android:value="string/12345678901234567890" />
<meta-data android:name="value2" android:value="integer/12345" />
<meta-data android:name="value3" android:value="boolean/true" />
<meta-data android:name="value4" android:value="float/1.34" />
<meta-data android:name="value5" android:value="float/6" />

请注意,这看起来与Android @string / @integer语法类似,只是我删除了@,将其解释为删除了间接级别。

除了解决原始问题[0-9] +总是被解释为整数之外,它还允许直接指定浮点数,尽管看起来像一个整数。

这样做的另一个优点是可以任意扩展这组类型。 e.g。

<meta-data android:name="myfrac" android:value="fraction/3/7" />