مصدر السلسلة

الإعلانات

مصدر السلسلة

يوفر مصدر السلسلة سلاسل نصية لتطبيقك مع تنسيق وتصميم نص إختياري. هناك ثلاثة أنواع من المصادر التي يمكنها أن تمد تطبيقك بالسلاسل:

السلسله

مصدر XML الذي يقوم بتوفير سلسلة وحيده.

مصفوفة السلسله

مصدر XML الذي يوفر مصفوفة سلاسل.

كمية السلاسل (بصيغة الجمع)

مصدر XML يحمل سلاسل مختلفة التعدديه.

جميع السلاسل قادرة على تطبيق بعض علامات التصميم و وسيطات التنسيق. للحصول على معلومات حول سلاسل التصميم والتنسيق، راجع القسم الخاص بالتنسيق والتصميم.

 

السلسله

هي سلسلة وحيدة يمكن الإشارة إليها من التطبيق أو من ملفات مصادر أخرى مثل (مخطط xml).

ملاحظة: السلسلة عبارة عن مصدر بسيط يشار إليه بواسطة إستخدام القيمة المتوفرة في سمة الأسم (وليس اسم ملف XML). لذلك، يمكنك دمج مصادر السلسلة مع مصادر بسيطة أخرى في ملف XML واحد، تحت عنصر <resources> واحد.

موقع الملف:

res/values/filename.xml
اسم الملف عشوائي (من إختيارك). اسم عنصر الـ<string> يستخدم كمعرف للمصدر.

جمع أنواع بيانات المصادر:

مصادر تشير إلى سلسله.

الإشارة للمصدر:

في ملف الجافا: R.string.string_name
في ملف XML:
string/string_name@

بناء الجمله:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string
        name="string_name"
        >text_string</string>
</resources>

 

العناصر:

عنصر <resources>

مطلوب. يجب أن يكون عقدة أساسية.

لا سمات له.

عنصر <string>

سلسلة، يمكن أن تحتوي على وسوم تصميم. تنبه أنه يجب عليك التخلص من الفواصل العليا و علامات الإقتباس. لمزيد من المعلومات حول كيفية تصميم وتنسيق سلاسلك بشكلٍ صحيح، راجع التنسيق والتصميم أدناه.

السمات:

سمة name

سلسلة. اسم السلسله. يتم إستخدام هذا الاسم كمعرف للمصدر.

مثال:

ملف XML محفوظ في res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello!</string>
</resources>

 

 

مخطط XML هذا يقوم بتطبيق سلسلة إلى العرض (المعاينه):

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

 

 

هذا الكود يقوم بإسترجاع سلسله:
 KOTLIN

val string: String = getString(R.string.hello)

  JAVA

String string = getString(R.string.hello);

 

 

يمكنك إما إستخدام (getString(int أو (getText(int لإسترجاع سلسلة. (getText(int تحتفظ بأي نص منسق وتقوم بتطبيقه على السلسلة.

 

مصفوفة السلسلة


هي مصفوفة سلاسل يمكن الإشارة إليها من خلال التطبيق.

ملاحظة: مصفوفة السلسلة عبارة عن مصدر بسيط يشار إليه بإستخدام القيمة المتوفرة في سمة الأسم (وليس في اسم ملف XML). لهذا، يمكنك دمج مصادر مصفوفة السلسلة مع المصادر البسيطة الأخرى في ملف XML واحد، تحت عنصر <resources> واحد.

موقع الملف:

res/values/filename.xml
اسم الملف عشوائي (من إختيارك). اسم عنصر مصفوفة السلسله يستخدم كمعرف للمصدر.

جمع أنواع بيانات المصادر:

تشير المصادر إلى مصفوفة سلسلة S.

الإشارة للمصدر:

في ملف الجافا: R.array.string_array_name

بناء الجمله:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array
        name="string_array_name">
        <item
            >text_string</item>
    </string-array>
</resources>

 

 

العناصر:

عنصر <resources>

مطلوب. يجب أن يكون العقدة الأساسيه.
لا سمات له.

عنصر <string-array>

تحدد مصفوفة سلسله. تحتوي على واحد أو أكثر من عناصر <item>.

السمات:

سمة name

سلسلة. اسم المصفوفه. يستخدم هذا الأسم كمعرف للمصدر للإشارة إلى المصفوفه.

عنصر <item>

سلسلة، يمكن أن تحتوي على وسوم تصميم. يمكن أن تكون القيمة مرجعاً لمصدر سلسلة أخرى. يجب أن تكون تابعة لعنصر <string-array>. تنبه أنه يجب عليك التخلص من الفواصل العليا و علامات الإقتباس. راجع التنسيق والتصميم أدناه، لمزيد من المعلومات حول كيفية تصميم وتنسيق سلاسلك بشكلٍ صحيح.

لا سمات له.

مثال:
ملف XML محفوظ في res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
    </string-array>
</resources>

 

هذا الكود يسترجع مصفوفة سلسله:

KOTLIN 

val array: Array = resources.getStringArray(R.array.planets_array)

JAVA

Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);

 

 

 

 

كمية السلاسل (بصيغة الجمع)


لغات مختلفة لديها قواعد مختلفة للتوافق النحوي مع الكمية. على سبيل المثال، في اللغة الإنجليزية، الكمية 1 هي حالة خاصه. نكتب “1 book”، ولكن لأي كمية أخرى نضيف صيغة الجمع هكذا “n books” بإضافة حرف s حيث تمثل n الأرقام الأكبر من 1. هذا التمييز بين المفرد والجمع أمر شائع جداً، ولكن هناك لغات أخرى تتميز بميزات أكثر دقة. المجموعة الكاملة المدعومه من الأندرويد هي صفر، واحد، إثنان، قليل، كثير، وغيرها.

قواعد تقرير الحالة المستخدمة في لغة معينة وكمياتها، يمكن أن تكون معقدة للغاية، بحيث يوفر لك الأندرويد أساليب لتحديد المصدر المناسب لك مثل ()getQuantityString.

على الرغم من أنه تاريخياً يسمى “سلاسل الكمية” (ولا يزال يطلق عليه ذلك الاسم في برمجيات واجهة التطبيق)، إلا أنه يجب استخدام سلاسل الكمية فقط لصيغ الجمع. سيكون من الخاطئ إستخدام سلاسل الكمية لإجراء شيء مثل “البريد الوارد” مقابل “البريد الوارد (12)” في الجيميل عندما تكون هناك على سبيل المثال، رسائل غير مقروءة. قد يبدو من الملائم إستخدام سلاسل الكمية بدلاً من العبارة إذاif“، ولكن من المهم ملاحظة أن بعض اللغات مثل (الصينيه) لا تحتوي على هذه الفروق النحوية إطلاقاً، لذا ستقوم دائماً بالحصول على السلاسل الأخرى other.

عملية إختيار أي سلسلة يجب إستخدامها تعتمد فقط على الحاجة النحويه. ففي اللغة الإنجليزية، يتم تجاهل سلسلة الصفر حتى لو كانت الكمية صفر، لأن الصفر ليس مختلفاً نحوياً عن 2، أو أي رقم آخر بإستثناء 1 (“zero books”, “one book”, “two books”, وهكذا). على العكس، في اللغة الكورية فقط يتم إستخدام السلسلة الأخرى دائماً.

لا تتوه بسبب حقيقة ذلك القول، أن صوتين مثلهما يمكن أن ينطبقان فقط على الكمية 2: ربما تتطلب اللغة أن كل من 2, 12, 102 (وهكذا) يجب أن تعامل جميعها مثل بعضها ولكن بشكلٍ مختلف عن الكميات الأخرى. أعتمد على مترجمك لمعرفة الفروق التي تصر عليها لغتهم في الواقع.

يمكن غالباً تجنب سلاسل الكمية عن طريق إستخدام تركيبات محايدة للكمية مثل “الكتب: 1”. فهذا يجعل حياتك وحياة المترجمين أسهل، إذا كان أسلوباً مقبولاً لتطبيقك.

ملاحظة: مجموعة صيغ الجمع عبارة عن مصدر بسيط يتم الإشارة إليه بإستخدام القيمة المتوفرة في سمة الأسم (وليس اسم ملف XML). لهذا، يمكنك دمج مصادر الجمع مع المصادر البسيطة الأخرى في ملف XML واحد، تحت عنصر <resources> واحد.

موقع الملف:

res/values/filename.xml
اسم الملف عشوائي. اسم عنصر <plurals> يستخدم كمعرف للمصدر.

الإشارة للمصدر:

في ملف الجافا: R.plurals.plural_name

تركيب الجمله:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals
        name="plural_name">
        <item
            quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
            >text_string</item>
    </plurals>
</resources>

 

العناصر:

عنصر <resources>

مطلوب. يجب أن يكون العقدة الأساسيه.
لا سمات له.

عنصر <plurals>

مجموعة من السلاسل، يتم توفير سلسلة واحدة بناءً على كمية شيء ما. يحتوي على واحد أو أكثر من عناصر <item>.

السمات:
سمة name

سلسلة. اسم زوج من السلاسل. يستخدم هذا الأسم كمعرف للمصدر.

عنصر <item>

سلسلة جمع أو مفرد. القيمة يمكن أن تكون إشارة إلى مصدر سلسلة أخرى. يجب أن يكون تابع لعنصر <plurals>. تنبه إلى أنه يجب عليك التخلص من الفواصل العليا وعلامات الإقتباس. راجع التنسيق والتصميم أدناه، للحصول على معلومات حول تصميم وتنسيق السلاسل بشكلٍ صحيح.

السمات:
سمة quantity

كلمة أساسية. قيمة تبين متى يتم إستخدام هذه السلسلة. القيم الصالحة، مع أمثلة مختصرة بين قوسين:

القيمه الوصف
zero عندما تتطلب اللغة معاملة خاصة للرقم “0” (مثل اللغة العربيه)
one عندما تتطلب اللغة معاملة خاصة لأرقام مثل “1” (كما هو الحال مع الرقم “1” في اللغة الإنجليزية ومعظم اللغات الأخرى؛ في اللغة الروسية، أي رقم ينتهي بـ”1″ ولا ينتهي بـ”11″ هو في هذه الفئة).
two عندما تتطلب اللغة معاملة خاصة لأرقام مثل “2” (كما هو الحال مع الرقم “2” في اللغة الويلزيه، أو الرقم “102” في اللغة السلوفيكينيه).
few عندما تتطلب اللغة معاملة خاصة للأرقام “الصغيره” (كما هو الحال مع الأرقام “2”، “3”، “4” في اللغة التشيكيه، أو الأرقام التي تنتهي بـ”2″، “3”، “4” ولكن ليست “12”، “13”، “14” كما في اللغة البولنديه). 
many عندما تتطلب اللغة معاملة خاصة للأرقام “الكبيره” (كما هو الحال مع الأرقام المنتهية بـ”11 – 99″ في اللغة المالطيه).
other عندما لا تتطلب اللغة معاملة خاصة للكمية المعطاه (كما هو الحال مع جميع الأرقام في اللغة الصينيه، أو الرقم “42” في اللغة الإنجليزية).

مثال:

ملف XML محفوظ في res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="numberOfSongsAvailable">
        <!--
             As a developer, you should always supply "one" and "other"
             strings. Your translators will know which strings are actually
             needed for their language. Always include %d in "one" because
             translators will need to use %d for languages where "one"
             doesn't mean 1 (as explained above).
          -->
        <item quantity="one">%d song found.</item>
        <item quantity="other">%d songs found.</item>
    </plurals>
</resources>

 

ملف XML محفوظ في res/values-pl/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="numberOfSongsAvailable">
        <item quantity="one">Znaleziono %d piosenkę.</item>
        <item quantity="few">Znaleziono %d piosenki.</item>
        <item quantity="other">Znaleziono %d piosenek.</item>
    </plurals>
</resources>

 

الإستخدام:
KOTLIN

val count = getNumberOfSongsAvailable()
val songsFound = resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count)

JAVA

int count = getNumberOfSongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);

 

 

عند إستخدام الدالة ()getQuantityString، يجب عليك تمرير العدد count مرتين إذا كانت سلسلتك تحتوي على تنسيق سلسلة مع رقم. مثال، d songs found% ، معامل العدد الأول يختار سلسلة الجمع المناسبة و معامل العدد الثاني يتم إدخاله إلى نائب d%. إذا لم تحتوي سلاسل الجمع خاصتك على سلسلة تنسيق فلست بحاجة إلى تمرير المعامل الثالث إلى getQuantityString.

 

 

التنسيق والتصميم


فيما يلي بعض الأمور الهامة التي يجب عليك معرفتها حول كيفية تنسيق وتصميم مصادر سلاسلك بشكلٍ صحيح.

التعامل مع الأحرف الخاصه

عندما تحتوي السلسلة على أحرف لها إستخدام خاص في XML أو الأندرويد، يجب عليك تخطي الأحرف. يمكن أن يتم تخطي بعض الأحرف بإستخدام الشرطة المائلة “\”، بينما آخرون يتطلبون تخطي من خلال ملف XML. يمكن أيضاً التعامل مع الفواصل العليا وعلامات الإقتباس المفردة لحصر السلسلة بأكملها بعلامات إقتباس مزدوجة. إليك بعض الأمثلة أدناه:

 

الرمز شكل التخطي
@ @\
? ?\
> ;lt&
& ;amp&
علامة إقتباس مفردة (‘) أي مما يلي:
  • ;apos&
  • ‘\
  • حصر السلسلة بأكملها بواسطة علامة إقتباس مزدوجة (كمثال، “هذا سينجح”).
علامة إقتباس مزدوجة  (“) أي مما يلي:
  • ;quot&
  • “\

لاحظ أنه يجب عليك تخطي علامة الإقتباس المزدوجة. حصر السلسلة بواسطة علامة إقتباس مفردة لن ينجح.

 

تنسيق السلاسل

إذا كنت بحاجة إلى تنسيق سلاسلك، يمكنك القيام بذلك عن طريق وضع معطيات تنسيقك في مصدر السلسلة، كما هو موضح في المثال التالي:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

 

في هذا المثال، تحتوي سلسلة التنسيق على وسيطتين:  هي سلسلة و  هي رقم عشري. إذاً، يتم تنسيق السلسلة بإستدعاء (...getString(int, Object مثال:

KOTLIN

var text = getString(R.string.welcome_messages, username, mailCount)

JAVA

String text = getString(R.string.welcome_messages, username, mailCount);

 

 

 

 

التصميم بإستخدام ترميز HTML


يمكنك إضافة تنسيق إلى سلاسلك بإستخدام ترميز HTML مثال:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome">Welcome to <b>Android</b>!</string>
</resources>

 

 

عناصر HTML التاليه مدعومه:

  • عريض: <b>, <em>

– مائل: <i>, <cite>, <dfn>

– كبير: نص أكبر 25%

– صغير: نص أصغر 20%

– ضبط خصائص الخط: <font face=”font_family“ color=”hex_color”> تتضمن أمثلة على عائلات الخطوط الممكنه monospace, serif، sans_serif.

– إعدادات عائلة الخط monospace
<tt>.

– يتوسطه خط: <s>, <strike>, <del>

– تحته خط: <u>

– نص علوي: <sup>

– نص سفلي: <sub>

– ترقيم: <ul>, <li>

– خط فاصل: <br>

– تقسيم: <div>

  • تصميم CSS: 

<span style=”color|background_color|text-decoration”>

– فقرات: <p dir=”rtl | ltr” style=”…”>

 

إذا لم تكن تطبق تنسيق، يمكنك تعيين نص TextView مباشرة بإستدعاء (setText(java.lang.CharSequence. مع ذلك في بعض الحالات، قد تحتاج إلى إنشاء مصدر نص مُنسق يستخدم أيضاً كسلسلة تنسيق. عادة، هذا لا يعمل لأن التنسيق

(...format(String, Object والداله  (...getString(int, Object يزيلان جميع معلومات التصميم من السلسلة. الحل لهذه المشكلة هو بالقيام بكتابة وسوم HTML مع كيانات تخطي، والتي يتم إستردادها بعد ذلك بإستخدام (fromHtml(String بعد إجراء التنسيق. مثال:

1- قم بحفظ مصدر النص المُصمم كسلسلة HTML متخطاه:

<resources>
  <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
</resources>

 

في هذه السلسلة المنسقه، تم إضافة العنصر <b>. لاحظ أن قوس الفتح عبارة عن تخطي HTML، بإستخدام الرمز ;lt&.

2- قم بتنسيق السلسلة كالمعتاد، ولكن قم أيضاً بإستدعاء (fromHtml(String لتحويل نص HTML إلى نص منسق:
KOTLIN

val text: String = getString(R.string.welcome_messages, username, mailCount)
val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)

JAVA

String escapedUsername = TextUtils.htmlEncode(username);

String text = getString(R.string.welcome_messages, escapedUsername, mailCount);
Spanned styledText = Html.fromHtml(text);

 

لأن الدالة (fromHtml(String تقوم بتنسيق جميع كيانات HTML، تأكد من تخطي أي أحرف HTML محتمله في السلاسل التي تستخدمها مع النص المنسق، بإستخدام (htmlEncode(String. مثال، إذا قمت بتنسيق سلسلة تحتوي على أحرف مثل “<” أو “&”، إذاً يجب تخطيها قبل القيام بالتنسيق، بحيث أنه عندما يتم تمرير السلسلة المنسقه خلال (fromHtml(String، تظهر الأحرف بنفس طريقة كتابتها الأصليه. مثال:

KOTLIN

val escapedUsername: String = TextUtils.htmlEncode(username)

val text: String = getString(R.string.welcome_messages, escapedUsername, mailCount)
val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)

JAVA

String escapedUsername = TextUtils.htmlEncode(username);

String text = getString(R.string.welcome_messages, escapedUsername, mailCount);
Spanned styledText = Html.fromHtml(text);

 

 

 

التصميم مع ميزة القدرة على التمدد


القدرة على التمدد هي كائن نص يمكنك تصميمه بإستخدام خصائص محارف مثل اللون و وزن الخط. يمكنك إستخدام SpannableStringBuilder لبناء النص ثم تطبيق التصميم المحدد في الحزمة android.text.style على النص.

يمكنك إستخدام الدوال المساعدة التاليه لإعداد الكثير من اعمال إنشاء نص قادر على التمدد:

KOTLIN

/**
 * Returns a CharSequence that concatenates the specified array of CharSequence
 * objects and then applies a list of zero or more tags to the entire range.
 *
 * @param content an array of character sequences to apply a style to
 * @param tags the styled span objects to apply to the content
 *        such as android.text.style.StyleSpan
 */
private fun apply(content: Array<out CharSequence>, vararg tags: Any): CharSequence {
    return SpannableStringBuilder().apply {
        openTags(tags)
        content.forEach { charSequence ->
            append(charSequence)
        }
        closeTags(tags)
    }
}

/**
 * Iterates over an array of tags and applies them to the beginning of the specified
 * Spannable object so that future text appended to the text will have the styling
 * applied to it. Do not call this method directly.
 */
private fun Spannable.openTags(tags: Array<out Any>) {
    tags.forEach { tag ->
        setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK)
    }
}

/**
 * "Closes" the specified tags on a Spannable by updating the spans to be
 * endpoint-exclusive so that future text appended to the end will not take
 * on the same styling. Do not call this method directly.
 */
private fun Spannable.closeTags(tags: Array<out Any>) {
    tags.forEach { tag ->
    if (length > 0) {
            setSpan(tag, 0, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        } else {
            removeSpan(tag)
        }
    }
}

JAVA

/**
 * Returns a CharSequence that concatenates the specified array of CharSequence
 * objects and then applies a list of zero or more tags to the entire range.
 *
 * @param content an array of character sequences to apply a style to
 * @param tags the styled span objects to apply to the content
 *        such as android.text.style.StyleSpan
 *
 */
private static CharSequence applyStyles(CharSequence[] content, Object[] tags) {
    SpannableStringBuilder text = new SpannableStringBuilder();
    openTags(text, tags);
    for (CharSequence item : content) {
        text.append(item);
    }
    closeTags(text, tags);
    return text;
}

/**
 * Iterates over an array of tags and applies them to the beginning of the specified
 * Spannable object so that future text appended to the text will have the styling
 * applied to it. Do not call this method directly.
 */
private static void openTags(Spannable text, Object[] tags) {
    for (Object tag : tags) {
        text.setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK);
    }
}

/**
 * "Closes" the specified tags on a Spannable by updating the spans to be
 * endpoint-exclusive so that future text appended to the end will not take
 * on the same styling. Do not call this method directly.
 */
private static void closeTags(Spannable text, Object[] tags) {
    int len = text.length();
    for (Object tag : tags) {
        if (len > 0) {
            text.setSpan(tag, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            text.removeSpan(tag);
        }
    }
}

 

الدوال التاليه: عريض، مائل، اللون. تحيط بالدوال المساعدة أعلاه وتوضح أمثلة معينة لتطبيق تصاميم محددة في حزمة android.text.style. يمكنك إنشاء دوال مماثلة للقيام بأنواع أخرى من تصميم النص.

KOTLIN

/**
 * Returns a CharSequence that applies boldface to the concatenation
 * of the specified CharSequence objects.
 */
fun bold(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.BOLD))

/**
 * Returns a CharSequence that applies italics to the concatenation
 * of the specified CharSequence objects.
 */
fun italic(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.ITALIC))

/**
 * Returns a CharSequence that applies a foreground color to the
 * concatenation of the specified CharSequence objects.
 */
fun color(color: Int, vararg content: CharSequence): CharSequence =
        apply(content, ForegroundColorSpan(color))

JAVA

/**
 * Returns a CharSequence that applies boldface to the concatenation
 * of the specified CharSequence objects.
 */
public static CharSequence bold(CharSequence... content) {
    return apply(content, new StyleSpan(Typeface.BOLD));
}

/**
 * Returns a CharSequence that applies italics to the concatenation
 * of the specified CharSequence objects.
 */
public static CharSequence italic(CharSequence... content) {
    return apply(content, new StyleSpan(Typeface.ITALIC));
}

/**
 * Returns a CharSequence that applies a foreground color to the
 * concatenation of the specified CharSequence objects.
 */
public static CharSequence color(int color, CharSequence... content) {
    return apply(content, new ForegroundColorSpan(color));
}

 

 

في ما يلي مثال على كيفية ربط هذه الدوال ببعضها لتطبيق عدة تصاميم على كلمات فردية في الجملة:

KOTLIN

// Create an italic "hello, " a red "world",
// and bold the entire sequence.
val text: CharSequence = bold(italic(getString(R.string.hello)),
        color(Color.RED, getString(R.string.world)))

JAVA

// Create an italic "hello, " a red "world",
// and bold the entire sequence.
var text = bold(italic(getString(R.string.hello)),
  color(Color.RED, getString(R.string.world)))
</pre>
</section><section><h3 id="java">Java</h3>
<pre class="prettyprint lang-java">
// Create an italic "hello, " a red "world",
// and bold the entire sequence.
CharSequence text = bold(italic(getString(R.string.hello)),
    color(Color.RED, getString(R.string.world)));

 

 

تحتوي لغة الكوتلن core-ktx Kotlin أيضاً على وظائف ملحقة تجعل التعامل مع التمدد أكثر سهوله. يمكنك الإطلاع على وثائق حزمة android.text على موقع GitHub لمعرفة المزيد.

لمزيد من المعلومات حول التعامل مع التمدد، راجع الروابط التاليه:

 

 

 

التصميم مع الحواشي

يمكنك تطبيق تصميم معقد أو مخصص بإستخدام فئة الحواشي مع وسم الحواشي <annotation> في ملف المصادر الخاص بك strings.xml. وسم الحواشي يسمح لك بوضع علامات على أجزاء من السلسلة لتصميم مخصص من خلال تحديد زوج “قيمه\مفتاح” مخصصه في XML الذي يمثل إطار العمل ومن ثم تحويلها إلى حواشي ممدده. يمكنك بعد ذلك إسترداد هذه الحواشي وإستخدام المفتاح والقيمة لتطبيق التصميم.

 

عند إنشاء الحواشي، تأكد من إضافة الوسم <annotation> لجميع ترجمات السلسلة في كل ملف strings.xml.

 

تطبيق محارف مخصصة لكلمة “نص” بكل اللغات

 

مثال – إضافة محارف مخصصة

1- أضف الوسم <annotation>، وقم بتعريف زوج “قيمة – مفتاح”. في هذه الحاله، يكون المفتاح = خط، والقيمه = نوع الخط، الذي نرغب في إستخدامه: title_emphasis

// values/strings.xml
<string name="title">Best practices for <annotation font="title_emphasis">text</annotation> on Android</string>

// values-es/strings.xml
<string name="title"><annotation font="title_emphasis">Texto</annotation> en Android: mejores prácticas</string>

 

 

2- قم بتحمل مصدر السلسلة وأبحث عن الحاشية بإستخدام مفتاح الخط. ثم قم بإنشاء تمدد مخصص و استبدل التمدد الموجود:

KOTLIN

// get the text as SpannedString so we can get the spans attached to the text
val titleText = getText(R.string.title) as SpannedString

// get all the annotation spans from the text
val annotations = titleText.getSpans(0, titleText.length, Annotation::class.java)

// create a copy of the title text as a SpannableString.
// the constructor copies both the text and the spans. so we can add and remove spans
val spannableString = SpannableString(titleText)

// iterate through all the annotation spans
for (annotation in annotations) {
   // look for the span with the key font
   if (annotation.key == "font") {
      val fontName = annotation.value
      // check the value associated to the annotation key
      if (fontName == "title_emphasis") {
         // create the typeface
         val typeface = getFontCompat(R.font.permanent_marker)
         // set the span at the same indices as the annotation
         spannableString.setSpan(CustomTypefaceSpan(typeface),
            titleText.getSpanStart(annotation),
            titleText.getSpanEnd(annotation),
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
      }
   }
}

// now, the spannableString contains both the annotation spans and the CustomTypefaceSpan
styledText.text = spannableString

JAVA

// get the text as SpannedString so we can get the spans attached to the text
SpannedString titleText = (SpannedString) getText(R.string.title_about);

// get all the annotation spans from the text
Annotation[] annotations = titleText.getSpans(0, titleText.length(), Annotation.class);

// create a copy of the title text as a SpannableString.
// the constructor copies both the text and the spans. so we can add and remove spans
SpannableString spannableString = new SpannableString(titleText);

// iterate through all the annotation spans
for (Annotation annotation: annotations) {
  // look for the span with the key font
  if (annotation.getKey().equals("font")) {
    String fontName = annotation.getValue();
    // check the value associated to the annotation key
    if (fontName.equals("title_emphasis")) {
    // create the typeface
    Typeface typeface = ResourcesCompat.getFont(this, R.font.roboto_mono);
    // set the span at the same indices as the annotation
    spannableString.setSpan(new CustomTypefaceSpan(typeface),
      titleText.getSpanStart(annotation),
      titleText.getSpanEnd(annotation),
      Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
  }
}

// now, the spannableString contains both the annotation spans and the CustomTypefaceSpan
styledText.text = spannableString;

 

 

إذا كنت تستخدم نفس النص عدة مرات، فيجب عليك إنشاء كائن SpannableString مرة واحدة ومن ثم إعادة إستخدامه حسب الحاجة لتجنب مشاكل الأداء ومشاكل الذاكرة المحتمله.

لمزيد من الأمثلة على إستخدام الحواشي، راجع تصميم نص أندرويد عام.

 

 

 

 

 

تمدد الحواشي وتقسيم النص


لأن تمدد الحواشي هي أيضاً تمدد القدرة على التجزيء، فإن أزواج (قيمة -مفتاح) يمكن أن تكون مجزأة وغير مجزأة. طالما أن مستقبل التجزيء يعرف كيفية ترجمة الحواشي، يمكنك إستخدام تمدد الحواشي لتطبيق تصميم مخصص على نص مجزئ.

للحفاظ على تصميمك المخصص عندما تقوم بتمرير النص إلى حزمة هدف، تحتاج أولاً إلى إضافة تمدد حواشي إلى نصك. يمكنك القيام بذلك في مصادر XML عبر الوسم <annotation>، كما هو موضح في المثال أعلاه، أو في الكود من خلال إنشاء حاشية جديدة و تعيينها كتمدد، كما هو موضح أدناه:

KOTLIN

val spannableString = SpannableString("My spantastic text")
val annotation = Annotation("font", "title_emphasis")
spannableString.setSpan(annotation, 3, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

// start Activity with text with spans
val intent = Intent(this, MainActivity::class.java)
intent.putExtra(TEXT_EXTRA, spannableString)
startActivity(intent)

JAVA مصدر السلسلة مصدر السلسلة مصدر السلسلة مصدر السلسلة مصدر السلسلة

SpannableString spannableString = new SpannableString("My spantastic text");
Annotation annotation = new Annotation("font", "title_emphasis");
spannableString.setSpan(annotation, 3, 7, 33);

// start Activity with text with spans
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(TEXT_EXTRA, spannableString);
this.startActivity(intent);

 

إسترجع النص من الحزمة كـSpannableString و ثم قم بتحليل الحاشية المرتبطة كما هو موضح في المثال أعلاه.

KOTLIN

// read text with Spans
val intentCharSequence = intent.getCharSequenceExtra(TEXT_EXTRA) as SpannableString

JAVA مصدر السلسلة

// read text with Spans
SpannableString intentCharSequence = (SpannableString)intent.getCharSequenceExtra(TEXT_EXTRA);

 

لمزيد من المعلومات حول تصميم النص، راجع الروابط التاليه:

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات