it-swarm.dev

Android Spanned و SpannedString و Spannable و SpannableString و CharSequence

يوفر Android مجموعة متنوعة من الواجهات المرتبطة بالنصوص والسلاسل: Spanned ، SpannedString ، Spannable ، SpannableString و CharSequence.

لقد استخدمت كل ما سبق في سيناريوهات مختلفة عادة بعد استخدام Html.fromHtml() لعرض نص قابل للربط داخل TextView من أجل تطبيق بعض التصميم عليه.

لقد حاولت فهم الغرض/استخدام هذه الواجهات من الوثائق الرسمية لنظام أندرويد وفشلت لأنه أمر مربك للغاية .. ما هو الغرض من هذه الواجهات؟ ما هي السيناريوهات الشائعة في الغالب عن استخدامها؟ في أي الحالات من الأفضل تجنب استخدامها؟ هل هناك أي تأثيرات واضحة على الأداء يجب مراعاتها عند استخدام أي منها؟

إذا كان أي شخص يمكن أن يقدم تفسيرا لائق سيكون موضع تقدير كبير.

79
woot

ما هو الغرض من هذه الواجهات؟

diagram from yuml.me/edit/5f8da6cbCharSequence هي واجهة جافا قياسية تمثل سلسلة من الأحرف. String هو التطبيق الملموس الأكثر استخدامًا لـ CharSequence ، متبوعًا بـ StringBuilder.

Spanned هو CharSequence مع "مسافات" تشير إلى التنسيق لتطبيقه على أجزاء من النص ، حيث لا يمكن تعديل هذه المسافات.

Spannable هو Spanned ، مضيفًا القدرة على تعديل المسافات (لإضافة أو إزالة التنسيق) ، لكن لا لتعديل النص نفسه.

SpannedString هو تطبيق ملموس للواجهة Spanned.

SpannableString هو تطبيق ملموس للواجهة Spannable.

ما هي السيناريوهات الشائعة في الغالب عن استخدامها؟

عندما يكون هناك طريقة تُرجع واحدة (على سبيل المثال ، getText() على EditText) أو عندما يكون هناك طريقة تأخذ واحدة كمعلمة (على سبيل المثال ، setText() على TextView). diagram from yuml.me/edit/35c8f39f

قد تكون حالتك المشار إليها باستخدام Html.fromHtml() هي الأكثر شيوعًا في تطوير Android التقليدي ، حيث إن TextView مع Spanned هو أخف وزنًا بكثير من WebView. ومع ذلك ، هناك حالات استخدام أخرى ، مثل:

في أي الحالات من الأفضل تجنب استخدامها؟

إنهم فظيعون في مكافحة الصلع ، وإزالة الثلج ، وإصلاح المضخات الحرارية ، وصنع سوفليه ، إلخ.

:-)

هل هناك أي تأثيرات واضحة على الأداء يجب مراعاتها عند استخدام أي منها؟

ليس للواجهات ، بحكم تعريفها ، "تأثيرات على الأداء" - إنها مجرد وصف لواجهة برمجة التطبيقات.

لست على علم بأن SpannableString أبطأ بكثير من SpannedString في أي عملية معينة. ومع ذلك ، قد يكون SpannableStringBuilder (الذي يسمح بمعالجة النص بالإضافة إلى المسافات التي تنسق هذا النص) أبطأ قليلاً من SpannableString أو SpannedString لأشياء مختلفة. سواء كانت اختلافات الأداء كافية أم لا ، فسوف تعتمد على الاستخدام.

136
CommonsWare

سلسلة

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

ب StringBuilder

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

SpannedString

يحتوي SpannedString على نص غير قابل للتغيير (مثل String) ومعلومات غير قابلة للتغيير. إنه تطبيق ملموس للمتطلبات المحددة بواسطة Spanned الواجهة. استخدم SpannedString عندما يحتوي النص على نمط لكنك لست بحاجة إلى تغيير النص أو النمط بعد إنشائه.

ملاحظة: لا يوجد شيء اسمه SpannedStringBuilder لأنه إذا تغير النص ، فمن المحتمل أن تتغير معلومات النطاق.

SpannableString

يحتوي SpannableString على نص ثابت ، لكن معلوماته الزمنية قابلة للتغيير. إنه تطبيق ملموس للمتطلبات المحددة بواسطة Spannable الواجهة. استخدم SpannableString عندما لا يحتاج النص إلى تغييره ولكن التصميم لا.

SpannableStringBuilder

يحتوي SpannableStringBuilder على معلومات قابلة للتغير للنص والامتداد. إنه تطبيق ملموس للمتطلبات المحددة بواسطة Spannable و Editable واجهات (من بين أمور أخرى). استخدم SpannableStringBuilder عندما تحتاج إلى تحديث النص وأسلوبه.

CharSequence

CharSequence هي واجهة وليست فئة محددة. هذا يعني أنه يحدد فقط قائمة القواعد الواجب اتباعها لأي فصل يقوم بتنفيذها. وجميع الطبقات المذكورة أعلاه تنفيذها. بحيث يمكنك استخدام CharSequence عندما تريد تعميم نوع الكائن الذي لديك لأقصى قدر من المرونة. يمكنك دائمًا تحويلها إلى String أو SpannableStringBuilder أو أيًا كان ما إذا كنت بحاجة إلى ذلك.

30
Suragch