Как заставить значение метаданных ввести строку?

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

Поскольку тип определяется автоматически системой сборки (booleans, ints, floats и strings), я задавался вопросом, есть ли способ заставить тип данных к строке.

Я попытался добавить пробел в конец ( "5555555555" ), но тогда значение получится как 5.5555553E9 float!).

Я также попытался использовать getString вместо get, но затем возвращается null.

Любые идеи? ТИА.

Ответ 1

Кажется, что работает пробег перед номером:

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

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

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

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

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

Ответ 2

У меня также есть такая проблема. Мое решение таково:

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

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

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

С уважением.

Ответ 3

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

Ответ 4

Недавно я столкнулся с этой проблемой, и очень разочаровывает то, что что-то вроде id приложения 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] +, всегда интерпретируемой как целые числа, она также позволяет указывать значения float, несмотря на то, что они выглядят как целые числа.

Еще одно преимущество этого заключается в том, что можно произвольно распространять множество типов. например.

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