TextView中字符串中的OnClick位置

时间:2011-06-08 21:47:43

标签: android indexing onclick textview

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

Hello I'm Vinay Hiremath.

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

非常感谢任何帮助。如果在Android Developers公然出现,请随意称我为白痴并投掷石块。

5 个答案:

答案 0 :(得分:22)

所以我最后通过James Moore的评论here中的链接来解决这个问题。我最终在该链接中使用了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;
    }
});
编辑:Rahul Mandaliya提请我注意,如果文本视图中有填充,则此代码将失败。不幸的是,自从我编写任何Android代码以来已经很长时间了,所以我不知道如何更新这个答案来解释这个问题。直观地说,如果您知道填充值,似乎可以对click事件进行某种检查。很抱歉在这个边缘案例中无法提供更多帮助。 : - (

答案 1 :(得分:10)

如果您遵循接受的答案,您可能会注意到每次用户触摸屏幕时都会多次提出onTouch事件。使用event.getAction()查找正在处理的操作。这取决于用户引发事件的行为。例如,对于屏幕上的简单触摸,onTouch事件将使用ACTION_DOWNACTION_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;
  }
});

答案 2 :(得分:3)

1)拿一份清单。

2)将此字符串拆分为单独的字符。

3)采取setOnItemClickListener(new OnItemClickListener())事件。

4)通过charcter的get args显示每个字符的Toast。

它会帮助你。

答案 3 :(得分:2)

因为我没有机会测试它,所以拿了一小撮盐。

true设置android:textIsSelectable属性为TextView,然后使用getSelectionStart()getSelectionEnd()方法。

我真的只是做了一个有根据的猜测。

答案 4 :(得分:0)

按照上面的正确答案,我添加了更多功能。这样,它还会向您显示您单击的字母,并且如果您在边界之外单击,它还会阻止错误,如果不将其放在try catch上,应用程序将崩溃。

build.gradle