1

给定一个EditText和它的OnTouch事件,我覆盖它,并返回真。这可以防止软键出现。但它也阻止了EditText. 那myEditText.getSelectionStart()将始终返回 0。

MotionEvent有没有办法根据事件的参数计算(或可以计算的Android函数)位置索引OnTouch

谢谢。

4

3 回答 3

2

从 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 级别的代码。如果有兴趣,我会在这里发布代码。

于 2013-10-31T00:35:02.257 回答
0

我意识到这个问题已经有一年了,但我目前正在尝试做同样的事情。我的理由是我需要一个很好的解决方案来处理本地化的 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;
        }
    });
于 2013-05-11T17:54:15.790 回答
0

在搜索 SO 和谷歌搜索后,我明白解决方案尚不清楚。所以我通过妥协解决了它。

我在键盘上提供了右/左箭头,用户可以使用它来移动光标。如果用户在显示我的键盘时点击编辑文本,他会得到一个 Toast,告诉他使用键盘来完成他想做的事情。

于 2012-04-22T12:04:18.243 回答