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

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

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

相关推荐
wefg18 小时前
【C语言】用 C 语言实现多态
c语言·开发语言
梦梦代码精8 小时前
LikeShop 是怎么解决数据库瓶颈的?
java·数据库·低代码·php
千码君20168 小时前
flutter:构建失败的原因总结
android·flutter·gradle·模拟器·dependencies·emulator
threelab8 小时前
Three.js 动态旋转同心圆着色器 | 三维可视化效果
开发语言·javascript·着色器
eRRA OFAG8 小时前
mysql之联合索引
java
奶茶树8 小时前
【STL/数据结构】哈希表和unordered系列容器的封装
开发语言·c++·散列表
Brilliantwxx8 小时前
【C++】初步认识STL(3)
开发语言·c++·笔记·算法
薪火铺子8 小时前
CAS单点登录原理与实践
java·后端
charlie1145141918 小时前
通用GUI编程技术——图形渲染实战(四十)——深度缓冲与3D变换:从平面到立体
开发语言·c++·平面·3d·图形渲染·win32