我不知道该怎么做,但我想知道当一个人点击TextView上的某个地方时,是否有办法在TextView中的String中获取位置(索引)。因此,如果有人点击以下TextView:
Hello I'm Vinay Hiremath.
在第一个'H'上,onClick事件将获得整数0。或者,如果有人点击'V',它将获得10,依此类推。
非常感谢任何帮助。如果在Android Developers公然出现,请随意称我为白痴并投掷石块。
答案 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_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;
}
});
答案 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