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

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

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

相关推荐
寻道码路2 分钟前
LangChain4j Java AI 应用开发实战(十四):手写 RAG 全流程 - 深入理解每个环节
java·开发语言·人工智能·ai
云烟成雨TD7 分钟前
Agent Scope Java 2.x 系列【1】核心架构
java·人工智能·agent
愛~杦辷个訾12 分钟前
Java Springboot使用阿里云oss对图片进行等质量压缩,转换成webp格式的压缩图。
java·spring boot·阿里云·oss
吴阿福|一人公司13 分钟前
Python 类变量修改的压力测试:高并发场景
开发语言·python
故渊at19 分钟前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi0019 分钟前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
天天进步201520 分钟前
Tunnelto 源码解析 #13:自托管部署:Docker、环境变量、端口规划与单实例限制
开发语言
AI科技星21 分钟前
第三卷:质数王朝志(全卷定稿)
c语言·开发语言·汇编·electron·概率论
霸道流氓气质23 分钟前
Spring Boot Multipart 表单中文乱码问题全解析
java·spring boot·后端
dadaobusi25 分钟前
Linux内核完成大量内存/调度/时间子系统初始化的关键阶段
java·linux·前端