2012-04-22 41 views
1

鉴于EditText及其OnTouch事件,我重写了它,并返回true。这可以防止软键出现。但它也可以防止内部计算EditText内部的位置指数。也就是说myEditText.getSelectionStart()将返回总是0MotionEvent在EditText中的位置索引

有没有一种方法来计算(或Android功能,可以计算)的基础上OnTouch事件的MotionEvent参数的位置索引?

谢谢。

+0

你能否更广泛地描述你想要达到的目标?我有一个软键盘设备,所以我不能发誓,但我怀疑一个硬键盘设备会弹出一个软 - 因此,我想你试图阻止一个软键盘设备弹出它......但有什么用处是EditText如果用户不能输入它?也许另一个小部件可能更有用?因此,为什么你更好地对你的想法给予更广泛的看法。最好的祝福。 – pouzzler 2012-04-22 10:15:00

+0

嗨,@pouzzler,我的确想要防止软性kesy出现,而是显示我自己的键,这些键很少,并且包含某些字符(大约12个特定键)。我可以模仿软键没有问题,除了触摸设置光标位置。 – 2012-04-22 10:59:33

回答

0

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

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

0

我意识到这个问题已经有一年了,但我目前正在尝试做同样的事情。我的理由是,我需要一个很好的解决方案来处理本地化数字DecimalEditText输入,Android本身并不能很好地执行:http://code.google.com/p/android/issues/detail?id=2626并且所有试图解决该问题的线程都无法在三星等制造商采用“数字”参数。

这不是用于将字段中的onTouch事件转换为光标位置的最终代码,但是我刚刚在半小时前开始,所以这里是我在R & 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; 
     } 
    }); 
+0

您可以使用'(int)((EditText)v).getPaint()。measureText(“0”)'来确定符号长度,如果View是EditText – wingear 2017-05-18 14:51:04

1

有一个在Android的API的今天呼吁getOffsetForPosition(浮法X,浮法Y),因为API 14级的解决方案,以获得字符位置,触摸是在edittext上制作的。它基本上是你可以从里面你的听众为如下的EditText(的onClick或onTouch)的一个调用的方法:

int click_position = <your_edittext>.getOffsetForPosition(event.getX(), event.getY()); 

,其中事件是MotionEvent传递到听者。 这给出了在该触摸被做了的EditText视图中的字符的位置,使用哪一个可以使用

edittext.setSelection(click_position); 

定位光标但是,如果你希望它是采用Android版本较早的设备上工作比4.0(ICS)(AP​​I等级13或更低),此API不可用。但是,您可以使用其他可用的API(这实质上是Google从API级别14执行的操作)为14以下的API版本开发自己的方法。 我做到了这一点,并能够成功地从motionevent获得编辑文本上的位置索引。我基本上编译了一个具有相同名称的静态方法,来自API中的其他API调用。我不确定是否需要现在发布旧API级别的代码。如果有兴趣,我会在这里发布代码。