鉴于EditText
及其OnTouch
事件,我重写了它,并返回true。这可以防止软键出现。但它也阻止了EditText
内部位置索引的内部计算。即myEditText.getSelectionStart()
将始终返回0。
有没有办法根据MotionEvent
事件的OnTouch
参数计算(或可以计算的Android函数)位置索引?
感谢。
答案 0 :(得分:1)
今天Android的API中有一个解决方案,称为API级别14的getOffsetForPosition(float x,float y),用于获取在edittext上进行触摸的字符位置。它基本上是一个方法,您可以在其中一个侦听器中为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不可用。但是,您可以使用其他可用的API(这实际上是Google从API级别14执行的操作)为14以下的API版本开发自己的方法。 我这样做了,并且能够成功地从motionevent获取edittext上的位置索引。我基本上编译了一个具有相同名称的静态方法,来自API级别1的Android中可用的其他API调用。我不确定是否需要发布旧API级别的代码。如果有兴趣,我会在这里发布代码。
答案 1 :(得分:0)
搜索SO和谷歌后我明白解决方案不明确。 所以我通过妥协来解决它。
我在键盘上提供右/左箭头,用户可以用它来移动光标。 如果用户在我的键盘显示时点击编辑文本,他会得到一个Toast告诉他使用键盘来做他想要做的事情。
答案 2 :(得分:0)
我意识到这个问题已经有一年了,但我现在正在尝试做同样的事情。我的理由是我需要一个很好的解决方案来处理本地化的numberDecimal EditText输入,Android本身并没有很好地做到:http://code.google.com/p/android/issues/detail?id=2626并且当试图处理这个问题的SO上的所有线程都不适用于像三星这样的制造商没有采用“数字”参数。
这不是将字段中的onTouch事件转换为光标位置的最终代码,但我刚开始大约半小时前,所以这就是我在R&amp; D中所做的事情。
它的作用很小。我只需要弄清楚如何计算不同屏幕的除数参数。值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;
}
});