سلسلة ديناميكية باستخدام string.xml؟
-
01-10-2019 - |
سؤال
هل من الممكن أن يكون لديك أصحاب نائبة في قيم السلسلة في string.xml
يمكن تعيين قيم في وقت التشغيل؟
مثال:
بعض السلسلة النائب 1 المزيد من السلسلة
المحلول
التنسيق والتصميم
نعم ، انظر ما يلي من موارد السلسلة: التنسيق والتصميم
إذا كنت بحاجة إلى تنسيق خيوطك باستخدام
String.format(String, Object...)
, ، ثم يمكنك القيام بذلك عن طريق وضع وسائط التنسيق الخاصة بك في مورد السلسلة. على سبيل المثال ، مع المورد التالي:<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
في هذا المثال ، تحتوي سلسلة التنسيق على وسيطان:
%1$s
هي سلسلة و%2$d
هو رقم عشري. يمكنك تنسيق السلسلة مع وسيطات من تطبيقك مثل هذا:Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
الاستخدام الأساسي
لاحظ أن getString
يحتوي على تحميل زائد يستخدم السلسلة كسلسلة تنسيق:
String text = res.getString(R.string.welcome_messages, username, mailCount);
مجموعات
إذا كنت بحاجة إلى التعامل مع الترطيب ، استخدم هذا:
<plurals name="welcome_messages">
<item quantity="one">Hello, %1$s! You have a new message.</item>
<item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>
الأول mailCount
يتم استخدام Param لتحديد التنسيق الذي يجب استخدامه (واحد أو صيغة الجمع) ، والمعاملات الأخرى هي بدائلك:
Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);
نرى موارد السلسلة: مجموعات لمزيد من التفاصيل.
نصائح أخرى
إجابة تكميلية
عندما رأيت لأول مرة %1$s
و %2$d
في الإجابة المقبولة ، لم يكن من المنطقي. هنا المزيد من التفسير.
وتسمى مواصفات التنسيق. في سلسلة XML هم في شكل
%[parameter_index$][format_type]
- %: علامة النسبة المئوية تمثل بداية محدد التنسيق.
- فهرس المعلمة: هذا رقم تليها علامة الدولار. إذا كان لديك ثلاثة معلمات تريد إدراجها في السلسلة ، فسيتم استدعاؤها
1$
,2$
, ، و3$
. لا يهم الطلب الذي تضعه في سلسلة الموارد ، فقط الترتيب الذي تقوم بتوفيره للمعلمات. نوع التنسيق: هناك كثير من الطرق التي يمكنك من خلالها تنسيق الأشياء (انظر الوثائق). فيما يلي بعضها الشائع:
s
سلسلةd
عدد صحيح عشريf
رقم النقطة العائمة
مثال
سنقوم بإنشاء السلسلة المنسقة التالية حيث يتم إدراج الأجزاء الرمادية برمجيًا.
أختى
Mary
هو12
سنوات.
String.xml
<string name="my_xml_string">My sister %1$s is %2$d years old.</string>
myactivity.java
String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);
ملحوظات
- يمكن أن أستخدم
getString
لأنني كنت في نشاط. يمكنك استخدامcontext.getResources().getString(...)
إذا لم يكن متاحًا. String.format()
سوف تنسيق أيضا سلسلة.- ال
1$
و2$
لا تحتاج إلى استخدام المصطلحات بهذا الترتيب. هذا هو،2$
يمكن أن يأتي من قبل1$
. يكون هذا مفيدًا عند تدويل تطبيق للغات التي تستخدم ترتيبًا مختلفًا للكلمات. - يمكنك استخدام محدد تنسيق مثل
%1$s
عدة مرات في XML إذا كنت تريد تكراره. - يستخدم
%%
للحصول على الفعلي%
حرف. - لمزيد من التفاصيل ، اقرأ البرنامج التعليمي المفيد التالي: نصيحة سريعة أندرويد SDK: سلاسل موارد التنسيق
عندما تريد استخدام معلمة من ملف strings.xml الفعلي دون استخدام أي رمز Java:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY appname "WhereDat">
<!ENTITY author "Oded">
]>
<resources>
<string name="app_name">&appname;</string>
<string name="description">The &appname; app was created by &author;</string>
</resources>
هذا لا يعمل عبر ملفات الموارد ، يجب نسخ متغيرات IE في كل ملف XML يحتاج إليها.
كان يبحث عن نفسه ووجد أخيرًا الحل البسيط للغاية. أفضل: يعمل خارج الصندوق.
1. قم بتغيير سلسلة reessource:
<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have
<xliff:g name="count">%d</xliff:g> new messages.</string>
2. استخدم استبدال السلسلة:
c.getString(R.string.welcome_messages,name,count);
حيث C هو السياق ، اسم هو متغير سلسلة و عدد متغير int الخاص بك
ستحتاج إلى تضمين
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
في الدقة/السلاسل. xml. يعمل لدي. قون
ومع ذلك ، يجب أن تقرأ أيضًا إلياس ميرتنسونإجابة على علاج أندرويد معالجة "صفر". هناك مشكلة في تفسير بعض القيم مثل "صفر".
في Kotlin ، تحتاج فقط إلى تعيين قيمة السلسلة مثل هذه:
<string name="song_number_and_title">"%1$d ~ %2$s"</string>
قم بإنشاء طريقة عرض نصية على التصميم:
<TextView android:id="@+id/song_number_and_title"/>
ثم قم بذلك في الكود الخاص بك إذا كنت تستخدم Anko:
val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))
قد تحتاج إلى الحصول على مواردك من سياق التطبيق.
في الدقة/القيم/string.xml
<resources>
<string name="app_name">Hello World</string>
<string name="my_application">Application name: %s, package name: %s</string>
</resources>
في كود جافا
String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);
يمكنك استخدام MessageFormat
<string name="customer_address">Wellcome: {0} {1}</string>
في كود جافا:
String text =MessageFormat(R.string.customer_address).format("Name","Family");
API المستوى 1:
https://developer.android.com/reference/java/text/messageformat.html
نسخة Kotlin من الإجابة المقبولة ...
val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)