Как заставить значение метаданных набирать строку? - PullRequest
23 голосов
/ 28 января 2010

Я указал метаданные в моем 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.

Есть идеи? ТИА.

Ответы [ 4 ]

35 голосов
/ 28 января 2010

Помещение пробела через пробел перед числом:

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

Пробел не отображается в значении, возвращаемом get().

Понятия не имею, как это работает, если честно.

Если вы хотите что-то задокументированное и, следовательно, более надежное, вы всегда можете поместить свое строковое значение в качестве ресурса и обратиться к нему:

<meta-data android:name="foo" android:resource="@string/mynumber"/>
9 голосов
/ 09 июня 2016

У меня тоже такая проблема. Мое решение заключается в следующем:

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

Я добавил в конец переменной - последовательность eskape "\ 0" (NULL - часто используется для определения конца строки символов (например, в языке C).

Эта работа для меня.

С уважением.

0 голосов
/ 21 апреля 2015

Недавно я столкнулся с этой проблемой, и очень расстраивает то, что что-то вроде идентификатора приложения Facebook интерпретируется как целое число, приводящее к проблемам из-за переполнения (конечно). Я бы подумал / надеялся, что можно будет переопределить неявную типизацию. Например, вместо:

<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" />
0 голосов
/ 28 января 2010

Вместо пробела попробуйте использовать пунктуацию, которая не должна иметь никакой роли в числовом значении, например двоеточие, и посмотрите, поможет ли это.

...