在EditText中定位MotionEvent的索引

时间:2012-04-22 09:24:57

标签: android

鉴于EditText及其OnTouch事件,我重写了它,并返回true。这可以防止软键出现。但它也阻止了EditText内部位置索引的内部计算。即myEditText.getSelectionStart()将始终返回0。

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

感谢。

3 个答案:

答案 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)(AP​​I级别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;
        }
    });