কম্পিউটার টিউটোরিয়াল

Kotlin ব্যবহার করে Android TextView-এ একাধিক স্টাইল প্রয়োগ করা

ওভারভিউ

এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে একটি একক 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)
)
  1. অ্যান্ড্রয়েডে থ্রেড (Thread) তৈরি করার পদ্ধতি

  2. অ্যান্ড্রয়েড TextView-এ একাধিক স্টাইল প্রয়োগ করার পদ্ধতি

  3. অ্যান্ড্রয়েডে XML স্টাইল ব্যবহার করে কাস্টম বাটন তৈরি করার পদ্ধতি

  4. Android-এ TextView-এ টেক্সট জাস্টিফাই (Justify) করার পদ্ধতি