24

我在 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 浮点数!)。

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

有任何想法吗?TIA。

4

4 回答 4

38

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

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

转义的空格不会出现在get().

老实说,我完全不知道这是如何工作的。

如果您想要记录一些内容并因此更可靠,您始终可以将您的字符串值作为资源并引用它:

<meta-data android:name="foo" android:resource="@string/mynumber"/>
于 2010-01-28T14:56:53.937 回答
9

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

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

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

这对我有用。

此致。

于 2016-06-09T07:53:16.040 回答
0

尝试使用不应在数值中起任何作用的标点符号(如冒号)代替空格,看看是否有帮助。

于 2010-01-28T14:35:27.937 回答
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]+ 似乎总是解释为整数的原始问题外,它还允许直接指定浮点数,尽管看起来像整数。

这样做的另一个优点是可以任意扩展类型集。例如

<meta-data android:name="myfrac" android:value="fraction/3/7" />
于 2015-04-21T18:10:00.837 回答