TextView中字符串中的OnClick位置

Vin*_*nay 15 indexing android onclick textview

我不知道该怎么做,但我想知道当一个人点击TextView上的某个地方时,是否有办法在TextView中的String中获取位置(索引).因此,如果有人点击以下TextView:

Hello I'm Vinay Hiremath.
Run Code Online (Sandbox Code Playgroud)

在第一个'H'上,onClick事件将获得整数0.或者,如果有人点击'V',它将获得10,依此类推.

任何帮助,像往常一样,非常感谢.如果在Android开发者身上公然露面,请随意称我为白痴并扔石头.

Vin*_*nay 23

所以,我最终经由詹姆斯·穆尔的评论链接解决这一这里.我最终在该链接中使用了Tony Blues的解决方案.那解决方案是这样的:

1.)将onTouchListener设置为TextView.

2.)获取TextView的布局.

3.)通过事件获取触摸的x,y坐标.

4.)根据该事件查找线和偏移量(索引).

下面的代码示例是如何在给定名为manip的TextView的情况下记录(详细)触摸的索引:

manip.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        Layout layout = ((TextView) v).getLayout();
        int x = (int)event.getX();
        int y = (int)event.getY();
        if (layout!=null){
            int line = layout.getLineForVertical(y);
            int offset = layout.getOffsetForHorizontal(line, x);
            Log.v("index", ""+offset);
        }
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑:Rahul Mandaliya提请我注意,如果文本视图中有填充,此代码将失败.不幸的是,自从我编写任何Android代码以来已经很长时间了,所以我不知道如何更新这个答案来解释这个问题.直观地说,如果您知道填充值,似乎可以对click事件进行某种检查.很抱歉在这个边缘案例中无法提供更多帮助.:-(


Rac*_*lan 11

如果您正在按照接受的答案进行操作,您可能会注意到onTouch每次用户触摸屏幕时都会多次引发该事件.使用event.getAction()找出行动正在处理什么.这取决于用户引发事件的行为.例如,对于屏幕上的简单触摸,onTouch事件将通过动作ACTION_DOWN和触发两次ACTION_UP.对于触摸和移动,您将根据移动(在控件内,从外到内,或反之亦然)获得不同的操作.有关更多详细信息,请查看MotionEvent.

以下代码是仅接受ACTION_DOWN操作的已接受答案的修改版本:

manip.setOnTouchListener(new View.OnTouchListener() {
  public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      Layout layout = ((TextView) v).getLayout();
      int x = (int)event.getX();
      int y = (int)event.getY();
      if (layout!=null){
          int line = layout.getLineForVertical(y);
          int offset = layout.getOffsetForHorizontal(line, x);
          Log.v("index", ""+offset);
          }
    }
    return true;
  }
});
Run Code Online (Sandbox Code Playgroud)