1.自定义 View ClickWordTextView.java
java
import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.appcompat.widget.AppCompatTextView;
public class ClickWordTextView extends AppCompatTextView {
// 点击单词回调接口
public interface OnWordClickListener {
void onWordClick(String word);
}
private OnWordClickListener listener;
public void setOnWordClickListener(OnWordClickListener listener) {
this.listener = listener;
}
public ClickWordTextView(Context context) {
super(context);
}
public ClickWordTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ClickWordTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
float x = event.getX();
float y = event.getY();
Layout layout = getLayout();
if (layout == null) {
return super.onTouchEvent(event);
}
// 获取点击所在行
int line = layout.getLineForVertical((int) y);
// 获取点击位置字符下标
int offset = layout.getOffsetForHorizontal(line, x);
// 截取单词
String word = getWordByOffset(offset);
if (word != null && !word.trim().isEmpty()) {
if (listener != null) {
listener.onWordClick(word.trim());
}
}
}
return super.onTouchEvent(event);
}
// 根据下标获取完整单词
private String getWordByOffset(int offset) {
String content = getText().toString();
if (offset < 0 || offset >= content.length()) {
return "";
}
// 分隔符:空格、换行、常用标点
char[] separators = {' ', '\n', '\r', ',', '.', '!', '?', ';', ':', '(', ')', '[', ']'};
int start = offset;
while (start > 0 && !isSeparator(content.charAt(start - 1), separators)) {
start--;
}
int end = offset;
while (end < content.length() && !isSeparator(content.charAt(end), separators)) {
end++;
}
return content.substring(start, end);
}
// 判断是否是分隔符
private boolean isSeparator(char c, char[] separators) {
for (char s : separators) {
if (c == s) {
return true;
}
}
return false;
}
}
2.布局 activity_main.xml
java
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<!-- 自定义取词TextView -->
<com.example.yourapp.ClickWordTextView
android:id="@+id/clickTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:clickable="true"
android:focusable="true"
android:text="Hello world Android Java custom view
测试中文点击取词 easy study word"/>
<!-- 显示选中的单词 -->
<TextView
android:id="@+id/resultTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:textSize="20sp"
android:textColor="#ff0000"
android:text="点击上方文字取单词"/>
</LinearLayout>
3.MainActivity.java
java
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WordClickTextView clickTv = findViewById(R.id.clickTv);
TextView resultTv = findViewById(R.id.resultTv);
// 监听单词点击
clickTv.setOnWordClickListener(word -> {
resultTv.setText("选中单词:" + word);
});
}
}
4.使用说明
将代码里包名 com.example.yourapp 改成你自己项目的包名
直接运行 Android 项目
点击文字任意位置,自动截取英文 / 中文词汇
自动过滤空格、标点、换行,多行文本正常适配