স্ট্রিং রিসোর্স (ভিউ)

ধারণা এবং জেটপ্যাক কম্পোজ বাস্তবায়ন

একটি স্ট্রিং রিসোর্স আপনার অ্যাপ্লিকেশনের জন্য ঐচ্ছিক টেক্সট স্টাইলিং এবং ফরম্যাটিং সহ টেক্সট স্ট্রিং সরবরাহ করে। তিন ধরনের রিসোর্স রয়েছে যা আপনার অ্যাপ্লিকেশনকে স্ট্রিং সরবরাহ করতে পারে:

স্ট্রিং
এক্সএমএল রিসোর্স যা একটি একক স্ট্রিং প্রদান করে।
স্ট্রিং অ্যারে
এক্সএমএল রিসোর্স যা স্ট্রিং-এর একটি অ্যারে প্রদান করে।
পরিমাণ স্ট্রিং (বহুবচন)
এক্সএমএল রিসোর্স যা বহুবচন করার জন্য বিভিন্ন স্ট্রিং বহন করে।

সমস্ত স্ট্রিং-এর উপর কিছু স্টাইলিং মার্কআপ এবং ফরম্যাটিং আর্গুমেন্ট প্রয়োগ করা যায়। স্ট্রিং-এর স্টাইলিং ও ফরম্যাটিং সম্পর্কে জানতে, ফরম্যাটিং ও স্টাইলিং অংশটি দেখুন।

স্ট্রিং

একটি একক স্ট্রিং যা অ্যাপ্লিকেশন থেকে বা অন্যান্য রিসোর্স ফাইল (যেমন একটি XML লেআউট) থেকে উল্লেখ করা যেতে পারে।

ফাইলের অবস্থান:
res/values/ filename .xml
ফাইলের নামটি ইচ্ছামত হতে পারে। <string> এলিমেন্টের name রিসোর্স আইডি হিসেবে ব্যবহৃত হয়।
সংকলিত রিসোর্স ডেটাটাইপ:
একটি 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" />

এই অ্যাপ্লিকেশন কোডটি একটি স্ট্রিং পুনরুদ্ধার করে:

কোটলিন

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

জাভা

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

একটি স্ট্রিং পেতে আপনি getString(int) অথবা getText(int) ব্যবহার করতে পারেন। getText(int) স্ট্রিংটিতে প্রয়োগ করা যেকোনো রিচ টেক্সট স্টাইলিং অক্ষুণ্ণ রাখে।

স্ট্রিং অ্যারে

স্ট্রিংগুলির একটি অ্যারে যা অ্যাপ্লিকেশন থেকে উল্লেখ করা যেতে পারে।

ফাইলের অবস্থান:
res/values/ filename .xml
ফাইলের নামটি ইচ্ছামত হতে পারে। <string-array> এলিমেন্টের name রিসোর্স আইডি হিসেবে ব্যবহৃত হয়।
সংকলিত রিসোর্স ডেটাটাইপ:
String এর একটি অ্যারের রিসোর্স পয়েন্টার।
তথ্যসূত্র:
জাভাতে: R.array. string_array_name
XML-এ: @[ package :]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>
এই অ্যাপ্লিকেশন কোডটি একটি স্ট্রিং অ্যারে পুনরুদ্ধার করে:

কোটলিন

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

জাভা

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

পরিমাণ স্ট্রিং (বহুবচন)

পরিমাণ বোঝানোর ক্ষেত্রে ব্যাকরণগত সামঞ্জস্যের জন্য বিভিন্ন ভাষার বিভিন্ন নিয়ম রয়েছে। উদাহরণস্বরূপ, ইংরেজিতে ১ পরিমাণটি একটি বিশেষ ক্ষেত্র। আমরা লিখি "1 book", কিন্তু অন্য যেকোনো পরিমাণের জন্য আমরা লিখি " n books"। একবচন ও বহুবচনের মধ্যে এই পার্থক্যটি খুবই প্রচলিত, কিন্তু অন্যান্য ভাষা আরও সূক্ষ্ম পার্থক্য করে থাকে। অ্যান্ড্রয়েড দ্বারা সমর্থিত সম্পূর্ণ সেটটি হলো zero , one , two , few , many , এবং other

কোনো নির্দিষ্ট ভাষা ও পরিমাণের জন্য কোন কারক (case) ব্যবহার করা হবে, তা নির্ধারণের নিয়মকানুন বেশ জটিল হতে পারে, তাই অ্যান্ড্রয়েড আপনার জন্য উপযুক্ত রিসোর্সটি বেছে নিতে getQuantityString() এর মতো মেথড সরবরাহ করে।

API 24+ সংস্করণে আপনি এর পরিবর্তে আরও অনেক বেশি শক্তিশালী ICU MessageFormat ক্লাসটি ব্যবহার করতে পারেন।

ফাইলের অবস্থান:
res/values/ filename .xml
ফাইলের নামটি ইচ্ছামত হতে পারে। <plurals> এলিমেন্টের name রিসোর্স আইডি হিসেবে ব্যবহৃত হয়।
তথ্যসূত্র:
জাভাতে: 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
স্ট্রিং । স্ট্রিং জোড়াটির একটি নাম। এই নামটি রিসোর্স আইডি হিসেবে ব্যবহৃত হয়।
</dd>

<item>
একটি বহুবচন বা একবচন স্ট্রিং। এর মান অন্য কোনো স্ট্রিং রিসোর্সের একটি রেফারেন্স হতে পারে। এটি অবশ্যই একটি <plurals> এলিমেন্টের চাইল্ড হতে হবে। মনে রাখবেন যে আপনাকে অবশ্যই অ্যাপস্ট্রফি এবং উদ্ধৃতি চিহ্ন এস্কেপ করতে হবে। আপনার স্ট্রিংগুলোকে কীভাবে সঠিকভাবে স্টাইল ও ফরম্যাট করতে হয়, সে সম্পর্কে তথ্যের জন্য নিচে ‘ফরম্যাটিং এবং স্টাইলিং’ অংশটি দেখুন।

বৈশিষ্ট্য:

quantity
কীওয়ার্ড । একটি মান যা নির্দেশ করে কখন এই স্ট্রিংটি ব্যবহার করা উচিত। বৈধ মানসমূহ, বন্ধনীতে অসম্পূর্ণ উদাহরণসহ:
মূল্য বর্ণনা
zero যখন কোনো ভাষায় ০ সংখ্যাটির বিশেষ ব্যবহারের প্রয়োজন হয় (যেমন আরবিতে)।
one যখন কোনো ভাষায় একের মতো সংখ্যার জন্য বিশেষ ব্যবস্থার প্রয়োজন হয় (যেমন ইংরেজি এবং বেশিরভাগ অন্যান্য ভাষায় ১ সংখ্যার ক্ষেত্রে; রুশ ভাষায়, যে কোনো সংখ্যা যার শেষে ১ আছে কিন্তু ১১ নেই, তা এই শ্রেণীর অন্তর্ভুক্ত)।
two যখন কোনো ভাষায় দুই-এর মতো সংখ্যার জন্য বিশেষ পদ্ধতির প্রয়োজন হয় (যেমন ওয়েলশ ভাষায় ২, বা স্লোভেনীয় ভাষায় ১০২)।
few যখন কোনো ভাষায় "ছোট" সংখ্যার জন্য বিশেষ ব্যবস্থার প্রয়োজন হয় (যেমন চেক ভাষায় ২, ৩, এবং ৪-এর ক্ষেত্রে; অথবা পোলিশ ভাষায় যে সংখ্যাগুলোর শেষে ২, ৩, বা ৪ থাকে কিন্তু ১২, ১৩, বা ১৪ থাকে না)।
many যখন ভাষায় বড় সংখ্যার জন্য বিশেষ ব্যবস্থার প্রয়োজন হয় (যেমন মাল্টিজ ভাষায় ১১-৯৯ পর্যন্ত শেষ হওয়া সংখ্যাগুলোর ক্ষেত্রে)।
other যখন ভাষাটিতে প্রদত্ত পরিমাণের জন্য কোনো বিশেষ ব্যবস্থার প্রয়োজন হয় না (যেমন চীনা ভাষায় সমস্ত সংখ্যার ক্ষেত্রে, বা ইংরেজিতে ৪২-এর ক্ষেত্রে)।

উদাহরণ:
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>

ব্যবহার:

কোটলিন

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

জাভা

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

getQuantityString() মেথডটি ব্যবহার করার সময়, আপনার স্ট্রিং-এ যদি স্ট্রিং ফরম্যাটিং থাকে, তাহলে আপনাকে count দুইবার পাস করতে হবে। উদাহরণস্বরূপ, %d songs found স্ট্রিংটির জন্য, প্রথম count প্যারামিটারটি উপযুক্ত বহুবচন স্ট্রিং নির্বাচন করে এবং দ্বিতীয় count প্যারামিটারটি %d প্লেসহোল্ডারে বসানো হয়। যদি আপনার বহুবচন স্ট্রিংগুলিতে স্ট্রিং ফরম্যাটিং না থাকে, তাহলে getQuantityString এ তৃতীয় প্যারামিটারটি পাস করার প্রয়োজন নেই।

বিন্যাস এবং শৈলী

আপনার স্ট্রিং রিসোর্সগুলোকে সঠিকভাবে ফরম্যাট ও স্টাইল করার বিষয়ে কয়েকটি গুরুত্বপূর্ণ বিষয় নিচে দেওয়া হলো।

স্ট্রিং ফরম্যাট করা

আপনার স্ট্রিংগুলো ফরম্যাট করার প্রয়োজন হলে, আপনি স্ট্রিং রিসোর্সে আপনার ফরম্যাট আর্গুমেন্টগুলো রেখে তা করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণ রিসোর্সটিতে দেখানো হয়েছে।

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

এই উদাহরণে, ফরম্যাট স্ট্রিংটিতে দুটি আর্গুমেন্ট আছে: %1$s হলো একটি স্ট্রিং এবং %2$d হলো একটি দশমিক সংখ্যা। এরপর, getString(int, Object...) কল করে স্ট্রিংটি ফরম্যাট করুন। উদাহরণস্বরূপ:

কোটলিন

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

জাভা

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

এইচটিএমএল মার্কআপ দিয়ে স্টাইলিং

আপনি এইচটিএমএল মার্কআপ ব্যবহার করে আপনার স্ট্রিংগুলিতে স্টাইলিং যোগ করতে পারেন। উদাহরণস্বরূপ:

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

আপনি যদি ফরম্যাটিং প্রয়োগ না করেন, তাহলে setText(java.lang.CharSequence) কল করে সরাসরি TextView টেক্সট সেট করতে পারেন। তবে, কিছু ক্ষেত্রে আপনি এমন একটি স্টাইলযুক্ত টেক্সট রিসোর্স তৈরি করতে চাইতে পারেন যা ফরম্যাট স্ট্রিং হিসেবেও ব্যবহৃত হয়। সাধারণত, এটি কাজ করে না কারণ 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> এলিমেন্ট যোগ করা হয়েছে। লক্ষ্য করুন যে, শুরুর বন্ধনীটি &lt; চিহ্ন ব্যবহার করে HTML-এস্কেপ করা হয়েছে।

  2. তারপর স্ট্রিংটিকে যথারীতি ফরম্যাট করুন, কিন্তু HTML টেক্সটকে স্টাইল করা টেক্সটে রূপান্তর করতে fromHtml(String) কল করুন:

    কোটলিন

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

    জাভা

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

যেহেতু fromHtml(String) মেথডটি সমস্ত HTML এনটিটি ফরম্যাট করে, তাই ফরম্যাট করা টেক্সটের সাথে ব্যবহৃত স্ট্রিংগুলিতে থাকা যেকোনো সম্ভাব্য HTML ক্যারেক্টারকে htmlEncode(String) ব্যবহার করে এস্কেপ করতে ভুলবেন না। উদাহরণস্বরূপ, যদি আপনি এমন একটি স্ট্রিং ফরম্যাট করেন যাতে "<" বা "&"-এর মতো ক্যারেক্টার থাকে, তাহলে ফরম্যাট করার আগে সেগুলোকে অবশ্যই এস্কেপ করতে হবে, যাতে ফরম্যাট করা স্ট্রিংটি যখন fromHtml(String) মধ্য দিয়ে পাঠানো হয়, তখন ক্যারেক্টারগুলো ঠিক সেভাবেই আসে যেভাবে সেগুলো মূলত লেখা ছিল। উদাহরণস্বরূপ:

কোটলিন

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)

জাভা

String escapedUsername = TextUtils.htmlEncode(username);

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

স্প্যানেবল দিয়ে স্টাইলিং

Spannable হলো একটি টেক্সট অবজেক্ট, যাকে আপনি রঙ এবং ফন্ট ওয়েটের মতো টাইপফেস প্রোপার্টি দিয়ে স্টাইল করতে পারেন। আপনি আপনার টেক্সট তৈরি করতে SpannableStringBuilder ব্যবহার করেন এবং তারপর android.text.style প্যাকেজে সংজ্ঞায়িত স্টাইলগুলো সেই টেক্সটে প্রয়োগ করেন।

স্প্যানযোগ্য টেক্সট তৈরির বেশিরভাগ কাজ সেট আপ করার জন্য আপনি নিম্নলিখিত হেল্পার মেথডগুলো ব্যবহার করতে পারেন:

কোটলিন

/**
 * 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)
        }
    }
}

জাভা

/**
 * 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);
        }
    }
}

নিম্নলিখিত bold , italic , এবং color মেথডগুলো উপরের হেল্পার মেথডগুলোকে র‍্যাপ করে এবং android.text.style প্যাকেজে সংজ্ঞায়িত স্টাইল প্রয়োগের নির্দিষ্ট উদাহরণ প্রদর্শন করে। আপনি অন্যান্য ধরণের টেক্সট স্টাইলিং করার জন্য অনুরূপ মেথড তৈরি করতে পারেন।

কোটলিন

/**
 * 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))

জাভা

/**
 * 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));
}

একটি বাক্যাংশের মধ্যে থাকা স্বতন্ত্র শব্দগুলিতে বিভিন্ন শৈলী প্রয়োগ করার জন্য এই পদ্ধতিগুলিকে কীভাবে একসাথে ব্যবহার করা যায় তার একটি উদাহরণ এখানে দেওয়া হলো:

কোটলিন

// 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)))

জাভা

// 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 কোটলিন মডিউলটিতে এক্সটেনশন ফাংশনও রয়েছে যা স্প্যান নিয়ে কাজ করাকে আরও সহজ করে তোলে। আরও জানতে আপনি গিটহাবে android.text প্যাকেজের ডকুমেন্টেশন দেখতে পারেন।

স্প্যান নিয়ে কাজ করার বিষয়ে আরও তথ্যের জন্য, নিম্নলিখিত লিঙ্কগুলি দেখুন:

টীকা সহ স্টাইলিং

আপনার strings.xml রিসোর্স ফাইলগুলিতে <annotation> ট্যাগের সাথে Annotation ক্লাস ব্যবহার করে আপনি জটিল বা কাস্টম স্টাইলিং প্রয়োগ করতে পারেন। annotation ট্যাগটি আপনাকে XML-এ কাস্টম কী-ভ্যালু পেয়ার সংজ্ঞায়িত করার মাধ্যমে স্ট্রিং-এর অংশবিশেষকে কাস্টম স্টাইলিংয়ের জন্য চিহ্নিত করতে দেয়, যা ফ্রেমওয়ার্ক পরে Annotation span-এ রূপান্তর করে। এরপর আপনি এই অ্যানোটেশনগুলি পুনরুদ্ধার করতে পারেন এবং স্টাইলিং প্রয়োগ করার জন্য কী ও ভ্যালু ব্যবহার করতে পারেন।

অ্যানোটেশন তৈরি করার সময়, প্রতিটি strings.xml ফাইলে স্ট্রিং-এর সমস্ত অনুবাদে <annotation> ট্যাগটি যোগ করতে ভুলবেন না।


সকল ভাষায় 'text' শব্দটিতে একটি কাস্টম টাইপফেস প্রয়োগ করা

উদাহরণ - কাস্টম টাইপফেস যোগ করা

  1. <annotation> ট্যাগটি যোগ করুন এবং কী-ভ্যালু পেয়ারটি নির্ধারণ করুন। এক্ষেত্রে, কী হলো `font` , এবং ভ্যালু হলো আমরা যে ধরনের ফন্ট ব্যবহার করতে চাই: `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. স্ট্রিং রিসোর্সটি লোড করুন এবং ফন্ট কী-সহ অ্যানোটেশনগুলো খুঁজুন। তারপর একটি কাস্টম স্প্যান তৈরি করে বিদ্যমান স্প্যানটিকে প্রতিস্থাপন করুন।

    কোটলিন

    // 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

    জাভা

    // get the text as SpannedString so we can get the spans attached to the text
    SpannedString titleText = (SpannedString) getText(R.string.title);
    
    // 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 অবজেক্টটি একবার তৈরি করে প্রয়োজন অনুযায়ী পুনরায় ব্যবহার করা উচিত।

অ্যানোটেশন ব্যবহারের আরও উদাহরণের জন্য, অ্যান্ড্রয়েডে আন্তর্জাতিকীকৃত টেক্সটের স্টাইলিং দেখুন।

টীকা স্প্যান এবং টেক্সট পার্সেলিং

যেহেতু Annotation স্প্যানগুলোও ParcelableSpans , তাই কী-ভ্যালু পেয়ারগুলো পার্সেল এবং আনপার্সেল করা হয়। যতক্ষণ পর্যন্ত পার্সেলের প্রাপক অ্যানোটেশনগুলো কীভাবে ব্যাখ্যা করতে হয় তা জানেন, ততক্ষণ আপনি পার্সেল করা টেক্সটে কাস্টম স্টাইলিং প্রয়োগ করতে Annotation স্প্যান ব্যবহার করতে পারেন।

একটি ইন্টেন্ট বান্ডেলে টেক্সট পাঠানোর সময় আপনার নিজস্ব স্টাইলিং বজায় রাখতে, আপনাকে প্রথমে আপনার টেক্সটে Annotation স্প্যান যোগ করতে হবে। আপনি এটি এক্সএমএল রিসোর্সে <annotation> ট্যাগের মাধ্যমে করতে পারেন, যেমনটি উপরের উদাহরণে দেখানো হয়েছে, অথবা কোডে একটি নতুন Annotation তৈরি করে এবং সেটিকে স্প্যান হিসাবে সেট করে করতে পারেন, যেমনটি নীচে দেখানো হয়েছে:

কোটলিন

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)

জাভা

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);

উপরের উদাহরণে দেখানো অনুযায়ী, Bundle থেকে টেক্সটটিকে একটি SpannableString হিসেবে গ্রহণ করুন এবং তারপর এর সাথে সংযুক্ত অ্যানোটেশনগুলো পার্স করুন।

কোটলিন

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

জাভা

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

টেক্সট স্টাইলিং সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত লিঙ্কগুলি দেখুন: