当前位置: 首页 > news >正文

Android 英文文章选词

点击文章中的一个单词,获取它。
在这里插入图片描述

通过点击的坐标y来获取行数,通过x坐标获取字符偏移量,向前遍历匹配,向后遍历匹配,匹配不成功则跳出循环。截取开始位置和最后位置的字符串。

主要代码

public String getSelectText(int currOff) {
        int leftOff = currOff, rigthOff = currOff;
        int length = getText().toString().length();
        while (true) { //左移currOff
            if (leftOff <= 0) {
                break;
            }
            if (leftOff != 0) {
                leftOff = leftOff - 1;
                if (leftOff < 0) {
                    leftOff = 0;
                }
            }
            String selectText = getText().subSequence(leftOff, currOff).toString();
            if (!selectText.matches("^[()._0-9a-zA-Z'-]*")) {
                leftOff += 1;
                break;
            }
        }
        while (true) { //右移currOff
            if (rigthOff >= length) {
                break;
            }
            if (rigthOff != 0) {
                rigthOff = rigthOff + 1;
                if (rigthOff > length) {
                    rigthOff = length;
                }
            }

            String selectText = getText().subSequence(currOff, rigthOff).toString();
            if (!selectText.matches("^[()_0-9a-zA-Z'-]*")) {
                rigthOff -= 1;
                break;
            }
        }
        String endString = "";
        try {
            endString = getText().subSequence(leftOff, rigthOff).toString();
            if (!endString.trim().isEmpty()) {
                Selection.setSelection((Spannable) getText(), leftOff, rigthOff);//选中

                Log.d("WordTextView", "setSelection");
            } else {

                Log.d("WordTextView", endString);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return endString.trim();
    }

全部代码

主要控件

public class WordTextView extends androidx.appcompat.widget.AppCompatTextView {

    private Callback callback;


    public WordTextView(Context context) {
        super(context);
    }

    public WordTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public WordTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    public Callback getCallback() {
        return callback;
    }

    public void setCallback(Callback callback) {
        this.callback = callback;
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        Layout layout = getLayout();
        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

//                Selection.removeSelection(getEditableText());
                break;

            case MotionEvent.ACTION_HOVER_MOVE:
                break;

            case MotionEvent.ACTION_UP:


                int line = layout.getLineForVertical((int) event.getY());
                int off = layout.getOffsetForHorizontal(line, (int) event.getX());
                String selectText = getSelectText(off);

                if (selectText != null && callback != null) {

                    callback.getWord(selectText);
                }
                Log.d("WordTextView1", off + "," + selectText);
                break;
        }
        return true;
    }


    public String getSelectText(int currOff) {
        int leftOff = currOff, rigthOff = currOff;
        int length = getText().toString().length();
        while (true) { //左移currOff
            if (leftOff <= 0) {
                break;
            }
            if (leftOff != 0) {
                leftOff = leftOff - 1;
                if (leftOff < 0) {
                    leftOff = 0;
                }
            }
            String selectText = getText().subSequence(leftOff, currOff).toString();
            if (!selectText.matches("^[()._0-9a-zA-Z'-]*")) {
                leftOff += 1;
                break;
            }
        }
        while (true) { //右移currOff
            if (rigthOff >= length) {
                break;
            }
            if (rigthOff != 0) {
                rigthOff = rigthOff + 1;
                if (rigthOff > length) {
                    rigthOff = length;
                }
            }

            String selectText = getText().subSequence(currOff, rigthOff).toString();
            if (!selectText.matches("^[()_0-9a-zA-Z'-]*")) {
                rigthOff -= 1;
                break;
            }
        }
        String endString = "";
        try {
            endString = getText().subSequence(leftOff, rigthOff).toString();
            if (!endString.trim().isEmpty()) {
                Selection.setSelection((Spannable) getText(), leftOff, rigthOff);//选中

                Log.d("WordTextView", "setSelection");
            } else {

                Log.d("WordTextView", endString);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return endString.trim();
    }


    public interface Callback {

        void getWord(String word);
    }
}

使用

 WordTextView main_wtv = findViewById(R.id.main_wtv);
        main_wtv.setText(content);

        TextView textView = findViewById(R.id.main_tv_word);

        main_wtv.setCallback(new WordTextView.Callback() {
            @Override
            public void getWord(String word) {

                textView.setText(String.format("单词:%s", word));
            }
        });

布局

不要设置inputType,否则点击选词失效

 <com.jn.yyz.testone.WordTextView
        android:id="@+id/main_wtv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:lineSpacingMultiplier="1.5"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:text="Hello World!"
        android:textIsSelectable="true"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/main_tv_word" />

相关文章:

  • 【Go】函数闭包、堆和栈的概念
  • android ConstraintLayout布局 实战:打造复杂界面的最佳实践
  • Go语言--语法基础3--变量常量运算符--变量
  • 1.8PageTable
  • CSS选择器
  • 93.HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager
  • 蓝桥杯学习-12递归
  • git基础概念和操作
  • 2025年西安交通大学少年班招生考试初试数学试题(初中组)
  • 【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解
  • 继承知识点—详细
  • EMC整改黄金搭档:共模滤波器与磁环
  • Qt中的 #include “xxxx.moc“ 说明
  • 3.13-4 字符
  • 【C++】如何高效掌握UDP数据包解析
  • 2023年蓝桥杯 省赛 ————特殊日期
  • 2025年【广东省安全员C证第四批(专职安全生产管理人员)】考试及广东省安全员C证第四批(专职安全生产管理人员)模拟试题
  • CMake简单入门
  • priority_queue模拟实现
  • 靶场(十一)---小白心得靶场思路---Clue
  • 遵义公司做网站找哪个公司好/谷歌推广效果怎么样
  • 怎样做网站漂浮/新网站 seo
  • 厦门做企业网站找谁/百度seo排名优化教程
  • 网站建设内部问卷/百度站长工具怎么关闭
  • 龙岗网站 建设深圳信科/平面设计培训费用一般是多少
  • 做网站上的在线支付怎么做/免费外链网站