سؤال

هل من الممكن أن يكون لديك أصحاب نائبة في قيم السلسلة في 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top