Giới thiệu
Bài viết này minh họa cách làm đậm (bold) chỉ một phần cụ thể của văn bản trong TextView sử dụng SpannableString và StyleSpan. Cách này linh hoạt hơn so với đặt cả TextView thành bold.
Các bước thực hiện
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và tạo dự án.
Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="25dp"
android:textSize="40sp" />
</RelativeLayout>
Bước 3: Viết code logic (src/MainActivity.java)
import android.graphics.Typeface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.StyleSpan;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
String text = "Món ăn yêu thích của tôi là Phở";
SpannableString spannableString = new SpannableString(text);
StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
// Làm đậm từ "Phở" (vị trí 24-27 trong chuỗi tiếng Việt)
// Lưu ý: Cần tính chính xác index dựa trên chuỗi thực tế
spannableString.setSpan(boldSpan, 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
}
}
Bước 4: Cấu hình AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. TextView hiển thị "Món ăn yêu thích của tôi là Phở" với từ "Phở" được in đậm.
Các Span hữu ích khác
| Span | Chức năng |
|---|---|
| StyleSpan | Bold, Italic, Bold Italic |
| ForegroundColorSpan | Đổi màu chữ |
| BackgroundColorSpan | Đổi màu nền chữ |
| UnderlineSpan | Gạch chân |
| StrikethroughSpan | Gạch ngang |
| RelativeSizeSpan | Thay đổi cỡ chữ tương đối |
| ClickableSpan | Tạo link có thể nhấn |
| ImageSpan | Chèn hình ảnh vào văn bản |
Kết hợp nhiều Span
SpannableString ss = new SpannableString("Ví dụ");
ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new ForegroundColorSpan(Color.RED), 3, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new UnderlineSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ss);
Lưu ý
- Index trong setSpan là vị trí ký tự (0-based), không phải từ
- Dùng
Spanned.SPAN_EXCLUSIVE_EXCLUSIVEđể span không mở rộng khi chèn text - Có thể dùng
Html.fromHtml()cho HTML đơn giản:textView.setText(Html.fromHtml("Bình thường đậm bình thường"))