ওভারভিউ
এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে একটি একক TextView-এর ভিতরে HTML ট্যাগ বা SpannableString ব্যবহার করে ভিন্ন ভিন্ন স্টাইল (বোল্ড, ইট্যালিক, রঙ, আকার ইত্যাদি) প্রয়োগ করা যায়।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি
ধাপ ২: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:lineSpacingMultiplier="1.3" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textSize="16sp"
android:lineSpacingMultiplier="1.3" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textSize="16sp"
android:lineSpacingMultiplier="1.3" />
</LinearLayout>
ধাপ ৩: MainActivity.kt
import android.os.Bundle
import android.text.Html
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.text.style.RelativeSizeSpan
import android.text.style.StyleSpan
import android.text.style.UnderlineSpan
import android.text.style.StrikethroughSpan
import android.text.style.BackgroundColorSpan
import android.graphics.Typeface
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var textView1: TextView
private lateinit var textView2: TextView
private lateinit var textView3: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "TextView Multi-Style Demo"
textView1 = findViewById(R.id.textView1)
textView2 = findViewById(R.id.textView2)
textView3 = findViewById(R.id.textView3)
// পদ্ধতি ১: Html.fromHtml() (সহজ কিন্তু সীমিত)
textView1.text = Html.fromHtml(
"Multiple styles: " +
"Bold text, " +
"Italic text, " +
"Underlined, " +
"Red color, " +
"Large text, " +
"Small text, " +
"Strikethrough",
Html.FROM_HTML_MODE_LEGACY
)
// পদ্ধতি ২: SpannableString (শক্তিশালী এবং টাইপ-সেফ)
val spannable = SpannableString(
"Spannable: Bold, Italic, Red, Big, Highlighted, Underline, Strikethrough"
)
// "Bold" শব্দটি বোল্ড
spannable.setSpan(StyleSpan(Typeface.BOLD), 11, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// "Italic" শব্দটি ইট্যালিক
spannable.setSpan(StyleSpan(Typeface.ITALIC), 17, 23, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// "Red" লাল রঙে
spannable.setSpan(ForegroundColorSpan(0xFFFF0000.toInt()), 25, 28, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// "Big" বড় আকারে
spannable.setSpan(RelativeSizeSpan(1.5f), 30, 33, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// "Highlighted" হাইলাইটেড
spannable.setSpan(BackgroundColorSpan(0xFFFFFF00.toInt()), 35, 46, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// "Underline" আন্ডারলাইন
spannable.setSpan(UnderlineSpan(), 48, 57, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// "Strikethrough" স্ট্রাইকথ্রু
spannable.setSpan(StrikethroughSpan(), 59, 73, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
textView2.text = spannable
// পদ্ধতি ৩: String Resource থেকে (CDATA ব্যবহার)
textView3.text = Html.fromHtml(
getString(R.string.styled_text),
Html.FROM_HTML_MODE_LEGACY
)
}
}
ধাপ ৪: res/values/strings.xml
<resources>
<string name="styled_text"><![CDATA[
Resource-based styling:
Bold, Italic, Underline,
Green,
Big, Small,
Strikethrough
]]></string>
</resources>
Spannable কী এবং কেন ব্যবহার করবেন?
Spannable হলো একটি ইন্টারফেস যা টেক্সটের নির্দিষ্ট রেঞ্জে ماركআপ (স্টাইল, রঙ, আকার, ক্লিক লিসেনার ইত্যাদি) লাগানোর অনুমতি দেয়। এটি Html.fromHtml()-এর চেয়ে:
- দ্রুত (পার্সিং নেই)
- টাইপ-সেফ (কম্পাইল টাইম চেক)
- অনলিমিটেড কাস্টম স্প্যান সাপোর্ট (ClickableSpan, ImageSpan, CustomSpan ইত্যাদি)
- রানটাইমে ডাইনামিক আপডেট সম্ভব
সাধারণ স্প্যান টাইপস
| স্প্যান ক্লাস | কাজ |
|---|---|
StyleSpan | বোল্ড, ইট্যালিক, বোল্ড+ইট্যালিক |
ForegroundColorSpan | টেক্সট রঙ |
BackgroundColorSpan | পটভূমি রঙ (হাইলাইট) |
RelativeSizeSpan | আপেক্ষিক আকার (১.৫x, ০.৮x ইত্যাদি) |
AbsoluteSizeSpan | এবসোলিউট আকার (sp/dp) |
UnderlineSpan | আন্ডারলাইন |
StrikethroughSpan | স্ট্রাইকথ্রু |
ClickableSpan | ক্লিকযোগ্য লিংক (MovementMethod লাগে) |
ImageSpan | ইনলাইন ইমেজ/ইমোজি |
TypefaceSpan | ফন্ট ফ্যামিলি |
SubscriptSpan/SuperscriptSpan | সাবস্ক্রিপ্ট/সুপারস্ক্রিপ্ট |
প্রো টিপ: এক্সটেনশন ফাংশন
fun TextView.setSpans(vararg spans: Pair) { val spannable = SpannableString(text) spans.forEach { (span, range) -> spannable.setSpan(span, range.start, range.endInclusive + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) } text = spannable } // ব্যবহার: textView.setSpans( StyleSpan(Typeface.BOLD) to (0..4), ForegroundColorSpan(Color.RED) to (6..10) )