2011-06-08 30 views
12

我不知道如何去做这件事,但我想知道是否有一种方法来获取在TextView中的字符串中的位置(索引),当一个人点击TextView中。所以,如果有人点击下面的TextView:OnClick在TextView中的字符串中的位置

Hello I'm Vinay Hiremath. 

第一“H”,onClick事件会得到整数0或者,如果有人点击了“V”,它将获得10和等等。

任何帮助,像往常一样,非常感谢。随意称我为白痴,并投掷石块,如果这是公然在Android Developers

+1

看起来你问http://stackoverflow.com/questions/2302867/android-how- to-determine-character-index-of-a-touch-events-position-in-textview – 2011-07-01 21:01:28

回答

21

所以我最终通过詹姆斯摩尔的评论here中的链接解决了这个问题。我最终在该链接中使用了Tony Blues的解决方案。解决方案是这样的:

1.)将onTouchListener设置为TextView。

2.)获取TextView的布局。

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

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

下面的代码示例是一个如何将日志(在详细)给出一个TextView名为MANIP触摸的指标:

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; 
    } 
}); 

编辑:拉胡尔Mandaliya已经把它带到我的注意,该代码将失败如果在文本视图中有填充。不幸的是,自从我编写了任何Android代码以来,这已经很长时间了,所以我不知道如何更新这个答案来解决这个问题。直观地说,如果你知道填充值,你似乎可以对点击事件进行某种检查。对不起,对这个边缘案例无法提供更多帮助。 :-(

+0

这只适用于textivew的布局宽度和高度是包装内容的情况。如果你使宽度或高度填充父母,然后选择其他偏移 – 2015-05-28 12:18:31

+0

@RahulMandaliya选择哪个偏移量?我会更新我的回答 - 从我完成任何Android事情开始,这已经很长时间了。 :-P – Vinay 2015-05-28 18:23:32

+0

只需在你的textview中添加填充,然后点击外部文本 你必须添加textview的条件,如if(offset <= text.length()) 然后它的工作 – 2015-05-28 19:12:34

2

带一点盐,因为我没有机会测试它。

设置android:textIsSelectable属性trueTextView然后使用getSelectionStart()getSelectionEnd()方法。

再次,我真的只是一个受过教育的猜测。

+0

谢谢你为伟大的方向Octavian!这实际上对我未来在我的应用中的功能非常有用,如果它有效的话。但是,只要我将“android:textIsSelectable =”true“”放入我的XML布局中,就会告诉我“在'android'包'中找不到属性'textIsSelectable'的资源标识符。你有什么想法这可能意味着什么?它看起来像有人在这里面临同样的问题:http://androidforums.com/application-development/330162-how-do-i-make-textview-text-selectable.html但没有得到答案。任何帮助表示赞赏。 – Vinay 2011-06-10 02:47:58

+0

作为一个便笺,我明白这个问题是关于完全不同的东西,所以,一旦我找出整个“textIsSelectable”问题,是否可以帮助我,如果你的答案有效,我会给你信用和标记它作为这个问题的答案。我总是在应有的地方给予奖励。 – Vinay 2011-06-10 02:49:50

+0

哦。看来这个问题是由于我没有告诉你方法'isTextSelectable()'来自API级别'11'(蜂窝)。我不确定它是否工作。我必须亲自尝试。 – 2011-06-10 10:01:33

3

1)取一个列表。

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

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

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

它会帮助你。

+0

如果Octavian的答案适用于我,那么我会使用它(它可以更好地满足我的需求),但+1可以用于解决此问题的创意/不同方式。 ;-) – Vinay 2011-06-10 02:50:45

9

如果按照接受的答案,您可能会注意到,每当用户触摸屏幕时,该事件都会不止一次地发生,请使用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; 
    } 
}); 
+0

Upvote from me。在这一点上,我已经触摸了与Android有关的任何东西已经有一段时间了,但这似乎是有道理的。 :-) – Vinay 2014-02-24 22:00:09