给定一个EditText
和它的OnTouch
事件,我覆盖它,并返回真。这可以防止软键出现。但它也阻止了EditText
. 那myEditText.getSelectionStart()
将始终返回 0。
MotionEvent
有没有办法根据事件的参数计算(或可以计算的Android函数)位置索引OnTouch
?
谢谢。
给定一个EditText
和它的OnTouch
事件,我覆盖它,并返回真。这可以防止软键出现。但它也阻止了EditText
. 那myEditText.getSelectionStart()
将始终返回 0。
MotionEvent
有没有办法根据事件的参数计算(或可以计算的Android函数)位置索引OnTouch
?
谢谢。
从 API 级别 14 开始,今天 Android 的 API 中有一个称为 getOffsetForPosition(float x,float y) 的解决方案,用于获取在编辑文本上进行触摸的字符位置。它基本上是一种您可以从您的一个侦听器内部为 edittext(onClick 或 onTouch)调用的方法,如下所示:
int click_position = <your_edittext>.getOffsetForPosition(event.getX(), event.getY());
其中 event 是传递给侦听器的 MotionEvent。这给出了在edittext视图上进行触摸的字符的位置,使用它可以定位光标使用
edittext.setSelection(click_position);
但是,如果您希望它在使用早于 4.0 (ICS)(API 级别 13 或更低)的 Android 版本的设备上运行,则此 API 不可用。但是,您可以为低于 14 的 API 版本开发自己的方法,使用其他可用的 API(这基本上是 Google 从 API 级别 14 所做的)。我这样做了,并且能够从motionevent成功获取edittext上的位置索引。我基本上从 API 级别 1 的 Android 中可用的其他 API 调用编译了一个具有相同名称的静态方法。我不确定现在是否需要发布旧 API 级别的代码。如果有兴趣,我会在这里发布代码。
我意识到这个问题已经有一年了,但我目前正在尝试做同样的事情。我的理由是我需要一个很好的解决方案来处理本地化的 numberDecimal EditText 输入,而 Android 本身并不能很好地做到这一点:http ://code.google.com/p/android/issues/detail?id=2626和所有线程当像三星这样的制造商未能采用“数字”参数时,试图处理该问题的 SO 将不起作用。
这不是将字段中的 onTouch 事件转换为光标位置的最终代码,但我大约半小时前才开始,所以这就是我在研发中的工作所在。
它的工作量很小。我只需要弄清楚如何计算不同屏幕的除数参数。16 的值适用于我的小型旧手机,但不适用于更高密度的 7 英寸平板电脑。
[编辑:在我测试过的设备上运行良好。判断这是否适用于更多设备还为时过早。]
myField.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent me) {
if (me.getAction() == MotionEvent.ACTION_DOWN) {
try {
float dp = App.get().getResources().getDisplayMetrics().density;
int div = (int) (10 * dp);
int x = (int) me.getX();
int pos = (v.getWidth() - x) / div;
int strlen = ((EditText)v).getText().toString().length();
int curpos = strlen - pos;
v.requestFocus();
if (curpos < 0) {
((EditText)v).setSelection(0);
} else {
((EditText)v).setSelection(curpos);
}
} catch (Exception e) {
Log.w(App.TAG, "onTouch exception " + e.toString());
}
}
return true;
}
});
在搜索 SO 和谷歌搜索后,我明白解决方案尚不清楚。所以我通过妥协解决了它。
我在键盘上提供了右/左箭头,用户可以使用它来移动光标。如果用户在显示我的键盘时点击编辑文本,他会得到一个 Toast,告诉他使用键盘来完成他想做的事情。