SpannableStringBuilder দিয়ে Subscript/Superscript
Android-এ টেক্সটের নির্দিষ্ট ক্যারেক্টারকে সাবস্ক্রিপ্ট (নিচে) বা সুপারস্ক্রিপ্ট (উপরে) করার জন্য SpannableStringBuilder ও Spannable ব্যবহার করা হয়।
ধাপ ১: প্রজেক্ট তৈরি
Android Studio-তে নতুন প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:padding="8dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="36sp"
android:textStyle="bold"
android:fontFamily="sans-serif-condensed" />
</RelativeLayout>
ধাপ ৩: MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.RelativeSizeSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
String strText;
SpannableStringBuilder spannableStringBuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
strText = "Test text to show SubscriptSpan X2 and SuperscriptSpan Y5 example.";
spannableStringBuilder = new SpannableStringBuilder(strText);
// SubscriptSpan: ক্যারেক্টার নিচে নামানো
SubscriptSpan subscriptSpan = new SubscriptSpan();
int index2 = strText.indexOf("2");
spannableStringBuilder.setSpan(subscriptSpan, index2, index2 + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// SuperscriptSpan: ক্যারেক্টার উপরে তোলা
SuperscriptSpan superscriptSpan = new SuperscriptSpan();
int index5 = strText.indexOf("5");
spannableStringBuilder.setSpan(superscriptSpan, index5, index5 + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// ছোট আকারে করা (সাব/সুপারস্ক্রিপ্টের জন্য সাধারণ)
showSmallSizeText("2");
showSmallSizeText("5");
textView.setText(spannableStringBuilder);
}
private void showSmallSizeText(String s) {
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(0.5f); // 50% আকার
int index = strText.indexOf(s);
spannableStringBuilder.setSpan(relativeSizeSpan, index, index + s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
ধাপ ৪: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.subsuperscript">
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Spannable Flags ব্যাখ্যা
| Flag | ব্যাখ্যা |
|---|---|
SPAN_EXCLUSIVE_EXCLUSIVE | স্প্যানের বাইরে টেক্সট যোগ হলে স্প্যান প্রসারিত হয় না (ডিফল্ট) |
SPAN_INCLUSIVE_INCLUSIVE | স্প্যানের বাইরে টেক্সট যোগ হলে স্প্যান প্রসারিত হয় |
SPAN_EXCLUSIVE_INCLUSIVE | শুধু শেষে যোগ হলে প্রসারিত হয় |
SPAN_INCLUSIVE_EXCLUSIVE | শুধু শুরুতে যোগ হলে প্রসারিত হয় |
অন্যান্য مفید Spannable ক্লাস
StyleSpan- Bold, Italic, Bold-ItalicForegroundColorSpan- টেক্সট রঙBackgroundColorSpan- হাইলাইট রঙUnderlineSpan- আন্ডারলাইনStrikethroughSpan- স্ট্রাইকথ্রুClickableSpan- ক্লিকযোগ্য টেক্সটURLSpan- লিংকImageSpan- ইমেজ ইনলাইন
হেল্পার মেথড (পুনরাবৃত্তি করা সহজ)
private void applySubscript(SpannableStringBuilder ssb, String text, String target) {
int start = text.indexOf(target);
if (start >= 0) {
ssb.setSpan(new SubscriptSpan(), start, start + target.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new RelativeSizeSpan(0.6f), start, start + target.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}