كيف تجبر قيمة البيانات الوصفية على كتابة السلسلة؟
-
23-09-2019 - |
سؤال
لقد حددت بيانات meta في manysest.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).
نظرًا لأن النوع يتم تحديده تلقائيًا بواسطة نظام الإنشاء (المنطقي ، INTs ، العوامات والسلاسل) ، تساءلت عما إذا كان هناك أي طريقة لإجبار نوع البيانات على السلسلة.
حاولت إضافة مساحة في النهاية ("5555555555") ، ولكن يتم تفسير القيمة بعد ذلك على أنها 5.5555553E9! ).
حاولت أيضًا استخدام GetString بدلاً من الحصول ، ولكن يتم إعادة NULL.
أيه أفكار؟ تيا.
المحلول
يبدو أن وضع مساحة نار أمام الرقم يعمل:
<meta-data android:name="foo" android:value="\ 1234567890"/>
لا تظهر المساحة التي هربت في القيمة التي تم إرجاعها بواسطة get()
.
ليس لدي أي فكرة تمامًا عن كيفية عمل هذا ، إذا كنت صادقًا.
إن أردت شيء موثق وبالتالي أكثر موثوقية ، يمكنك دائمًا وضع قيمة السلسلة الخاصة بك كمورد وإشارة إليها:
<meta-data android:name="foo" android:resource="@string/mynumber"/>
نصائح أخرى
لدي مثل هذه المشكلة. الحل الخاص بي على النحو التالي:
<meta-data android:value="5555555555\0" android:name="foo"></meta-data>
أضفت في نهاية متغير - تسلسل eskape " 0" (NULL - غالبًا ما يتم استخدامه لتحديد نهاية سلسلة الأحرف (على سبيل المثال ، باللغة C).
هذا العمل بالنسبة لي.
مع أطيب التحيات.
بدلاً من المساحة ، حاول استخدام جزء من علامات الترقيم التي لا ينبغي أن يكون لها دور في قيمة رقمية ، مثل القولون ، ومعرفة ما إذا كان ذلك يساعد.
لقد صادفت هذه المشكلة مؤخرًا ، ومن المحبط للغاية أن يتم تفسير شيء مثل معرف تطبيق 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" />