Giới thiệu
Ví dụ này minh họa cách làm cho một phần văn bản trong TextView có thể nhấn được (clickable) bằng cách sử dụng ClickableSpan và SpannableString.
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à điền thông tin cần thiết.
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"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="I want THIS and THIS to be CLICKED!"
android:layout_centerInParent="true"
android:textSize="16sp"
android:textStyle="bold|italic"/>
</RelativeLayout>
Bước 3: Viết code MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
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 = "I want THIS and THIS to be CLICKED";
SpannableString spannableString = new SpannableString(text);
// Tạo các ClickableSpan cho từng từ cần thiết
ClickableSpan clickableSpan1 = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "THIS (lần 1)", Toast.LENGTH_SHORT).show();
}
};
ClickableSpan clickableSpan2 = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "THIS (lần 2)", Toast.LENGTH_SHORT).show();
}
};
ClickableSpan clickableSpan3 = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "CLICKED", Toast.LENGTH_SHORT).show();
}
};
// Áp dụng span cho các vị trí cụ thể (start, end, flags)
// "I want THIS and THIS to be CLICKED"
// Index: 0123456789...
spannableString.setSpan(clickableSpan1, 7, 11, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // "THIS"
spannableString.setSpan(clickableSpan2, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // "THIS"
spannableString.setSpan(clickableSpan3, 27, 34, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // "CLICKED"
textView.setText(spannableString);
// BẮT BUỘC: Set movement method để TextView xử lý click
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
}
Lưu ý quan trọng: Phải gọi setMovementMethod(LinkMovementMethod.getInstance()) mới nhận được sự kiện click.
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 và thử nhấn vào các từ "THIS" và "CLICKED" để xem Toast.


