Android Java 自定义TextView点击取词,类似百度翻译的点击一段英文中的某个单词,可以显示点击了哪个单词

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 项目

点击文字任意位置,自动截取英文 / 中文词汇

自动过滤空格、标点、换行,多行文本正常适配

相关推荐
码智社36 分钟前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海38 分钟前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖2 小时前
JDK 26 新特性详解
java·开发语言
马优晨2 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区4 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大4 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai5 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说5 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
এ慕ོ冬℘゜5 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa5 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio