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

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

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

相关推荐
青梅味猪大肠3 分钟前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
CoderYanger4 分钟前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
程序员沉梦听雨7 分钟前
【搜索引擎】Kibana使用指南
java·后端·学习笔记
peakmain912 分钟前
异常处理 - Native 层的崩溃捕获机制及实现 (一)
android·性能优化
starzy19901 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala
木头左1 小时前
【Android】听写播放器改版:中英文书写速度拆项与「正在读」高亮
android·room·media3·jetpack compose·听写
奶油话梅糖2 小时前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
vipxieliang2 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
Rain的Java大神之路2 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试