একটি স্ট্রিং রিসোর্স ঐচ্ছিক টেক্সট স্টাইলিং এবং বিন্যাস সহ আপনার অ্যাপ্লিকেশনের জন্য পাঠ্য স্ট্রিং প্রদান করে। স্ট্রিং সহ আপনার অ্যাপ্লিকেশন প্রদান করতে পারে যে তিন ধরনের সম্পদ আছে:
- স্ট্রিং
- XML সংস্থান যা একটি একক স্ট্রিং প্রদান করে।
- স্ট্রিং অ্যারে
- XML রিসোর্স যা স্ট্রিং এর অ্যারে প্রদান করে।
- পরিমাণ স্ট্রিং (বহুবচন)
- XML সম্পদ যা বহুবচনের জন্য বিভিন্ন স্ট্রিং বহন করে।
সমস্ত স্ট্রিং কিছু স্টাইলিং মার্কআপ এবং ফর্ম্যাটিং আর্গুমেন্ট প্রয়োগ করতে সক্ষম। স্টাইলিং এবং ফর্ম্যাটিং স্ট্রিং সম্পর্কে তথ্যের জন্য, ফর্ম্যাটিং এবং স্টাইলিং সম্পর্কে বিভাগটি দেখুন।
স্ট্রিং
একটি একক স্ট্রিং যা অ্যাপ্লিকেশন থেকে বা অন্যান্য সংস্থান ফাইল থেকে উল্লেখ করা যেতে পারে (যেমন একটি XML লেআউট)।
দ্রষ্টব্য: একটি স্ট্রিং হল একটি সাধারণ সম্পদ যা name
বৈশিষ্ট্যে প্রদত্ত মান ব্যবহার করে উল্লেখ করা হয় (এক্সএমএল ফাইলের নাম নয়)। সুতরাং, আপনি একটি XML ফাইলে, একটি <resources>
উপাদানের অধীনে অন্যান্য সাধারণ সংস্থানগুলির সাথে স্ট্রিং সংস্থানগুলিকে একত্রিত করতে পারেন।
- ফাইল অবস্থান:
-
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>
- উপাদান:
- উদাহরণ:
- 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" />
এই অ্যাপ্লিকেশন কোডটি একটি স্ট্রিং পুনরুদ্ধার করে:
আপনি একটি স্ট্রিং পুনরুদ্ধার করতে
getString(int)
বাgetText(int)
ব্যবহার করতে পারেন।getText(int)
স্ট্রিং-এ প্রয়োগ করা যেকোন সমৃদ্ধ টেক্সট স্টাইলিং ধরে রাখে।
স্ট্রিং অ্যারে
স্ট্রিংগুলির একটি অ্যারে যা অ্যাপ্লিকেশন থেকে উল্লেখ করা যেতে পারে।
দ্রষ্টব্য: একটি স্ট্রিং অ্যারে একটি সাধারণ সংস্থান যা name
বৈশিষ্ট্যে প্রদত্ত মান ব্যবহার করে উল্লেখ করা হয় (এক্সএমএল ফাইলের নাম নয়)। যেমন, আপনি একটি XML ফাইলে একটি <resources>
উপাদানের অধীনে অন্যান্য সাধারণ সম্পদের সাথে স্ট্রিং অ্যারে সংস্থানগুলিকে একত্রিত করতে পারেন।
- ফাইল অবস্থান:
-
res/values/ filename .xml
ফাইলের নাম নির্বিচারে।<string-array>
উপাদানটিরname
রিসোর্স আইডি হিসেবে ব্যবহার করা হয়। - সংকলিত সম্পদ ডেটা টাইপ:
-
String
s এর একটি অ্যারের রিসোর্স পয়েন্টার। - সম্পদ রেফারেন্স:
- জাভাতে:
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>
- উপাদান:
- উদাহরণ:
- 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 একটি বিশেষ ক্ষেত্রে। আমরা "1টি বই" লিখি, কিন্তু অন্য কোনো পরিমাণের জন্য আমরা " n বই" লিখব। একবচন এবং বহুবচনের মধ্যে এই পার্থক্যটি খুব সাধারণ, তবে অন্যান্য ভাষাগুলি আরও সূক্ষ্ম পার্থক্য তৈরি করে। অ্যান্ড্রয়েড দ্বারা সমর্থিত সম্পূর্ণ সেট হল zero
, one
, two
, few
, many
এবং other
।
একটি প্রদত্ত ভাষা এবং পরিমাণের জন্য কোন ক্ষেত্রে ব্যবহার করতে হবে তা নির্ধারণ করার নিয়মগুলি খুব জটিল হতে পারে, তাই Android আপনাকে আপনার জন্য উপযুক্ত সংস্থান নির্বাচন করার জন্য getQuantityString()
এর মতো পদ্ধতিগুলি সরবরাহ করে৷
যদিও ঐতিহাসিকভাবে "পরিমাণ স্ট্রিং" বলা হয় (এবং এখনও API এ বলা হয়), পরিমাণ স্ট্রিং শুধুমাত্র বহুবচনের জন্য ব্যবহার করা উচিত। জিমেইলের "ইনবক্স" বনাম "ইনবক্স (12)" এর মতো কিছু প্রয়োগ করতে পরিমাণের স্ট্রিং ব্যবহার করা একটি ভুল হবে যখন সেখানে অপঠিত বার্তাগুলি থাকে, উদাহরণস্বরূপ। if
স্টেটমেন্টের পরিবর্তে পরিমাণের স্ট্রিং ব্যবহার করা সুবিধাজনক বলে মনে হতে পারে, কিন্তু এটা মনে রাখা গুরুত্বপূর্ণ যে কিছু ভাষা (যেমন চাইনিজ) এই ব্যাকরণগত পার্থক্যগুলি একেবারেই তৈরি করে না, তাই আপনি সর্বদা other
স্ট্রিং পাবেন।
কোন স্ট্রিং ব্যবহার করতে হবে তা নির্বাচন করা হয় শুধুমাত্র ব্যাকরণগত প্রয়োজনীয়তার উপর ভিত্তি করে। ইংরেজিতে, zero
জন্য একটি স্ট্রিং উপেক্ষা করা হয় যদিও পরিমাণটি 0 হয়, কারণ 0 ব্যাকরণগতভাবে 2 থেকে আলাদা নয়, বা 1 ছাড়া অন্য কোনো সংখ্যা নয় ("শূন্য বই", "এক বই", "দুই বই" এবং তাই অন)। বিপরীতভাবে, কোরিয়ান ভাষায় শুধুমাত্র other
স্ট্রিং ব্যবহার করা হয়।
এই সত্যের দ্বারাও বিভ্রান্ত হবেন না যে, বলুন, two
শব্দের মতো এটি শুধুমাত্র পরিমাণ 2 এর ক্ষেত্রে প্রযোজ্য হতে পারে: একটি ভাষার প্রয়োজন হতে পারে যে 2, 12, 102 (এবং আরও) সবগুলি একে অপরের মতো তবে অন্যের থেকে আলাদাভাবে ব্যবহার করা হয়। পরিমাণ তাদের ভাষা আসলে কোন পার্থক্যের উপর জোর দেয় তা জানতে আপনার অনুবাদকের উপর নির্ভর করুন।
যদি আপনার বার্তায় পরিমাণ সংখ্যা না থাকে তবে এটি সম্ভবত বহুবচনের জন্য একটি ভাল প্রার্থী নয়। উদাহরণস্বরূপ, লিথুয়ানিয়ান ভাষায় একবচন রূপটি 1 এবং 101 উভয়ের জন্য ব্যবহৃত হয়, তাই "1 বই" অনুবাদ করা হয় "1 knyga" হিসাবে এবং "101 বই" অনুবাদ করা হয় "101 knyga" হিসাবে। এদিকে "একটি বই" হল "কনিগা" এবং "অনেক বই" হল "দৌগ কিগো"। যদি একটি ইংরেজি বহুবচন বার্তায় প্রকৃত সংখ্যা ব্যতীত "একটি বই" (একবচন) এবং "অনেক বই" (বহুবচন) থাকে, তবে এটিকে "কনিগা" (একটি বই)/"ডাউগ কনিগ" (অনেক বই) হিসাবে অনুবাদ করা যেতে পারে তবে লিথুয়ানিয়ান নিয়ম, এটি "কনিগা" (একটি বই) দেখাবে, যখন সংখ্যাটি 101 হবে।
"বই: 1" এর মতো পরিমাণ-নিরপেক্ষ ফর্মুলেশন ব্যবহার করে পরিমাণের স্ট্রিংগুলি এড়ানো প্রায়ই সম্ভব। এটি আপনার এবং আপনার অনুবাদকদের জীবনকে সহজ করে তোলে, যদি এটি আপনার আবেদনের জন্য একটি গ্রহণযোগ্য স্টাইল হয়।
API 24+ এর পরিবর্তে আপনি আরও শক্তিশালী ICU MessageFormat
ক্লাস ব্যবহার করতে পারেন।
দ্রষ্টব্য: একটি বহুবচন সংগ্রহ একটি সাধারণ সম্পদ যা name
বৈশিষ্ট্যে প্রদত্ত মান ব্যবহার করে উল্লেখ করা হয় (এক্সএমএল ফাইলের নাম নয়)। যেমন, আপনি একটি XML ফাইলে, একটি <resources>
উপাদানের অধীনে অন্যান্য সাধারণ সম্পদের সাথে বহুবচন সংস্থানগুলিকে একত্রিত করতে পারেন।
- ফাইল অবস্থান:
-
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>
- উপাদান:
- উদাহরণ:
- 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
এর জন্য তৃতীয় প্যারামিটার পাস করতে হবে না।
বিন্যাস এবং শৈলী
আপনার স্ট্রিং সংস্থানগুলিকে কীভাবে সঠিকভাবে ফর্ম্যাট এবং স্টাইল করা যায় সে সম্পর্কে আপনার কিছু গুরুত্বপূর্ণ বিষয় এখানে রয়েছে।
বিশেষ অক্ষর পরিচালনা করুন
যখন একটি স্ট্রিং-এ XML-এ বিশেষ ব্যবহার আছে এমন অক্ষর থাকে, তখন আপনাকে অবশ্যই স্ট্যান্ডার্ড XML/HTML এস্কেপিং নিয়ম অনুযায়ী অক্ষরগুলি এড়িয়ে যেতে হবে। আপনার যদি Android-এ বিশেষ অর্থ আছে এমন একটি অক্ষর থেকে বাঁচতে হয় তবে আপনাকে একটি পূর্ববর্তী ব্যাকস্ল্যাশ ব্যবহার করতে হবে।
ডিফল্টরূপে অ্যান্ড্রয়েড হোয়াইটস্পেস অক্ষরগুলির ক্রমগুলিকে একটি একক স্পেসে ভেঙে ফেলবে৷ আপনি আপনার স্ট্রিং এর প্রাসঙ্গিক অংশ ডবল উদ্ধৃতিতে আবদ্ধ করে এটি এড়াতে পারেন। এই ক্ষেত্রে সমস্ত হোয়াইটস্পেস অক্ষর (নতুন লাইন সহ) উদ্ধৃত অঞ্চলের মধ্যে সংরক্ষিত হবে। দ্বৈত উদ্ধৃতিগুলি আপনাকে নিয়মিত একক অনির্বাচিত উদ্ধৃতিগুলিও ব্যবহার করার অনুমতি দেবে৷
চরিত্র | পালানো ফর্ম(গুলি) |
---|---|
@ | \@ |
? | \? |
নতুন লাইন | \n |
ট্যাব | \t |
U+XXXX ইউনিকোড অক্ষর | \uXXXX |
একক উদ্ধৃতি ( ' ) | নিচের যেকোনো একটি:
|
ডাবল উদ্ধৃতি ( " ) | \" মনে রাখবেন যে একক উদ্ধৃতি সহ স্ট্রিংকে ঘিরে কাজ করে না। |
আপনার রিসোর্স ফাইলটি XML হিসাবে পার্স হওয়ার পরে হোয়াইটস্পেস ভেঙে পড়া এবং অ্যান্ড্রয়েড এস্কেপিং ঘটে। এর মানে হল যে <string>      </string>
(স্পেস, বিরাম চিহ্ন স্পেস, ইউনিকোড এম স্পেস) সমস্ত একটি একক স্পেস ( " "
) এ ভেঙে যায়, কারণ ফাইলটিকে XML হিসাবে পার্স করার পরে সেগুলি সবই ইউনিকোড স্পেস। সেই স্পেসগুলি যেমন আছে সেগুলি সংরক্ষণ করতে, আপনি হয় সেগুলিকে উদ্ধৃত করতে পারেন ( <string>"      "</string>
) অথবা Android এস্কেপিং ( <string> \u0032 \u8200 \u8195</string>
ব্যবহার করতে পারেন <string> \u0032 \u8200 \u8195</string>
)।
দ্রষ্টব্য: XML পার্সারের দৃষ্টিকোণ থেকে, <string>"Test this"</string>
এবং <string>"Test this"</string>
মধ্যে কোন পার্থক্য নেই। উভয় ফর্মই কোনো উদ্ধৃতি দেখাবে না কিন্তু Android হোয়াইটস্পেস-সংরক্ষণের উদ্ধৃতি ট্রিগার করবে (যা এই ক্ষেত্রে কোনো ব্যবহারিক প্রভাব ফেলবে না)।
ফরম্যাটিং স্ট্রিং
আপনি যদি আপনার স্ট্রিংগুলিকে ফর্ম্যাট করতে চান, তাহলে আপনি স্ট্রিং রিসোর্সে আপনার ফর্ম্যাট আর্গুমেন্টগুলি রেখে তা করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণ সংস্থান দ্বারা প্রদর্শিত হয়েছে।
<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);
এইচটিএমএল মার্কআপ সহ স্টাইলিং
আপনি HTML মার্কআপের সাথে আপনার স্ট্রিংগুলিতে স্টাইলিং যোগ করতে পারেন। যেমন:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> </resources>
নিম্নলিখিত HTML উপাদান সমর্থিত:
- বোল্ড:<b>
- তির্যক: <i>, <cite>, <dfn>, <em>
- 25% বড় পাঠ্য: <big>
- 20% ছোট পাঠ্য: <small>
- ফন্ট বৈশিষ্ট্য সেট করা: <font face="font_family" color="hex_color">৷ সম্ভাব্য ফন্ট পরিবারের উদাহরণগুলির মধ্যে রয়েছে
monospace
,serif
এবংsans_serif
। - একটি মনোস্পেস ফন্ট পরিবার সেট করা হচ্ছে: <tt>
- স্ট্রাইকথ্রু: <s>, <স্ট্রাইক>, <del>
- আন্ডারলাইন: <u>
- সুপারস্ক্রিপ্ট: <sup>
- সাবস্ক্রিপ্ট: <sub>
- বুলেট পয়েন্ট: <ul>, <li>
- লাইন বিরতি: <br>
- বিভাগ: <div>
- CSS শৈলী: <span style="color|background_color|text-decoration">
- অনুচ্ছেদ: <p dir="rtl | ltr” style="…”>
আপনি যদি ফরম্যাটিং প্রয়োগ না করে থাকেন, তাহলে আপনি setText(java.lang.CharSequence)
কল করে সরাসরি TextView পাঠ্য সেট করতে পারেন। কিছু ক্ষেত্রে, যাইহোক, আপনি একটি স্টাইল করা পাঠ্য সংস্থান তৈরি করতে চাইতে পারেন যা ফর্ম্যাট স্ট্রিং হিসাবেও ব্যবহৃত হয়। সাধারণত, এটি কাজ করে না কারণ format(String, Object...)
এবং getString(int, Object...)
পদ্ধতিগুলি স্ট্রিং থেকে সমস্ত শৈলী তথ্য ছিনিয়ে নেয়। এর জন্য কাজ হল এইচটিএমএল ট্যাগগুলিকে এস্কেপড এন্টিটি দিয়ে লেখা, যেগুলি ফরম্যাটিং হওয়ার পরে fromHtml(String)
থেকে পুনরুদ্ধার করা হয়। যেমন:
- একটি HTML-এস্কেপড স্ট্রিং হিসাবে আপনার স্টাইল করা পাঠ্য সংস্থান সংরক্ষণ করুন:
<resources> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
এই বিন্যাসিত স্ট্রিংটিতে, একটি
<b>
উপাদান যোগ করা হয়েছে। লক্ষ্য করুন যে খোলার বন্ধনীটি 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 সত্তাকে ফরম্যাট করে, htmlEncode(String)
ব্যবহার করে ফরম্যাট করা পাঠ্যের সাথে আপনি যে স্ট্রিংগুলি ব্যবহার করেন তাতে সম্ভাব্য HTML অক্ষরগুলি এড়িয়ে যেতে ভুলবেন না। উদাহরণস্বরূপ, আপনি যদি এমন একটি স্ট্রিং ফর্ম্যাট করছেন যাতে "<" বা "&" এর মতো অক্ষর রয়েছে, তাহলে ফর্ম্যাট করার আগে সেগুলিকে এস্কেপ করতে হবে, যাতে ফরম্যাট করা স্ট্রিংটি যখন 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);
spannables সঙ্গে স্টাইলিং
একটি 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)));
কোর-কেটিএক্স কোটলিন মডিউলটিতে এক্সটেনশন ফাংশনও রয়েছে যা স্প্যানগুলির সাথে কাজ করা আরও সহজ করে তোলে। আপনি আরও জানতে GitHub-এ android.text প্যাকেজ ডকুমেন্টেশন দেখতে পারেন।
স্প্যানগুলির সাথে কাজ করার বিষয়ে আরও তথ্যের জন্য, নিম্নলিখিত লিঙ্কগুলি দেখুন:
টীকা সহ স্টাইলিং
আপনি আপনার strings.xml রিসোর্স ফাইলে <annotation>
ট্যাগের সাথে Annotation
ক্লাস ব্যবহার করে জটিল বা কাস্টম স্টাইলিং প্রয়োগ করতে পারেন। টীকা ট্যাগ আপনাকে XML-এ কাস্টম কী-মান জোড়া সংজ্ঞায়িত করে কাস্টম স্টাইলিং এর জন্য স্ট্রিংয়ের অংশগুলি চিহ্নিত করতে দেয় যা ফ্রেমওয়ার্কটি তারপর Annotation
স্প্যানে রূপান্তরিত হয়। তারপরে আপনি এই টীকাগুলি পুনরুদ্ধার করতে পারেন এবং স্টাইলিং প্রয়োগ করতে কী এবং মান ব্যবহার করতে পারেন।
টীকা তৈরি করার সময়, নিশ্চিত করুন যে আপনি প্রতিটি strings.xml ফাইলের স্ট্রিংয়ের সমস্ত অনুবাদে <annotation>
ট্যাগ যোগ করেছেন।
সমস্ত ভাষায় "টেক্সট" শব্দে একটি কাস্টম টাইপফেস প্রয়োগ করা হচ্ছে
উদাহরণ - একটি কাস্টম টাইপফেস যোগ করা
<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>
স্ট্রিং রিসোর্স লোড করুন এবং ফন্ট কী দিয়ে টীকা খুঁজুন। তারপরে একটি কাস্টম স্প্যান তৈরি করুন এবং বিদ্যমান স্প্যানটি প্রতিস্থাপন করুন।
কোটলিন
// 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
স্প্যান যোগ করতে হবে। আপনি XML রিসোর্সে <টীকা> ট্যাগের মাধ্যমে এটি করতে পারেন, যেমন উপরের উদাহরণে দেখানো হয়েছে, বা কোডে একটি নতুন 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);
একটি SpannableString
হিসাবে Bundle
থেকে পাঠ্যটি পুনরুদ্ধার করুন এবং তারপরে সংযুক্ত টীকাগুলিকে পার্স করুন, যেমন উপরের উদাহরণে দেখানো হয়েছে।
কোটলিন
// read text with Spans val intentCharSequence = intent.getCharSequenceExtra(TEXT_EXTRA) as SpannableString
জাভা
// read text with Spans SpannableString intentCharSequence = (SpannableString)intent.getCharSequenceExtra(TEXT_EXTRA);
টেক্সট স্টাইলিং সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত লিঙ্কগুলি দেখুন: