Как заставить значение метаданных ввести строку?
Я указал метаданные в файле 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" />