我正在使用Android软键盘并且想知道,键盘是否有办法获取当前光标位置?我目前正在使用以下代码:
connection.getTextBeforeCursor(Integer.MAX_VALUE, 0).length()
然而,这非常慢(即使是少量文本,也可能需要长达50毫秒 - 在Galaxy Nexus上运行,因此对于低端手机来说这可能会更慢)。我也在Droid Incredible上测试了它,而且滞后更严重。
在onUpdateSelection函数中,您将获得新的光标位置。但是,并不总是调用此函数,因此存储由其提供的值以供将来使用是不可靠的。
由于您可以设置光标位置并获取所选文本(但不是所选文本的位置),是否应该有一个函数来获取光标位置?
感谢您的帮助!
答案 0 :(得分:7)
这是一个较老的问题,但我最近遇到了同样的问题。获取光标位置:
InputConnection ic = getCurrentInputConnection();
ExtractedText et = ic.getExtractedText(new ExtractedTextRequest(), 0);
int selectionStart = et.selectionStart;
int selectionEnd = et.selectionEnd;
答案 1 :(得分:1)
我在这里参加晚会已经晚了几年,但是看起来这个问题在所提供的背景下还没有得到回答。问题指出,以下代码行最多需要50毫秒才能运行:
getTextBeforeCursor(int, int)
这可能是因为CharSequence
方法的Android实现似乎正在尝试实例化长度为{em> n 的Integer.MAX_VALUE
数组,然后再搜索所需的字符。在这种情况下,它试图实例化一个长度为InputConnection
的数组。返回的实际数组被裁剪为适当的大小。
我一直在使用类似的方法从EditText
获取光标位置,但是将 n 的值限制为我控制的最大值。因此,如果我将int cursorPosition = mInputConnection.getTextBeforeCursor(MAX_CHARACTERS, 0).length();
的最大字符数设置为25个字符,那么这就是我的 n 值。而且,它非常快。这是我的方法的一个示例:
int nrow=5,ncol=7,i,j;
float **ptr;
/*allocation*/
ptr=(float **) malloc(nrow*sizeof(float*));
ptr[0]=(float *) malloc(nrow*ncol*sizeof(float));
/*initialize*/
for (i=0;i<nrow;i++)
for (j=0;j<ncol;j++) ptr[i][j]=0.0;