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

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

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

相关推荐
Highcharts.js11 分钟前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
测试员周周5 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
Mahir087 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
杜子不疼.7 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号37 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
晓梦林7 小时前
cp520靶场学习笔记
android·笔记·学习
sycmancia8 小时前
Qt——编辑交互功能的实现
开发语言·qt
RyFit8 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码8 小时前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事9 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表