Android - 获取光标在当前行的位置。

时间:2013-12-30 13:35:51

标签: java android android-edittext

我有一个EditText,我想为用户显示光标信息。 但是我无法在用户正在编辑的行上获得光标位置。 对于前。

`The quick b|rown fox...` - Cursor @ line 0, symbol 13
`StackOverflow rule|s!` - Cursor @ line 1, symbol 20

我怎么能这样做?

请原谅我的英语。

2 个答案:

答案 0 :(得分:0)

您可以使用getSelectionStart()和getSelectionEnd()方法获取Cursor位置。如果没有突出显示文本,则getSelectionStart()和getSelectionEnd()都将返回游标的位置。 例如:

myEditText.getSelectionStart();

myEditText.getSelectionEnd();

获取行号

使用:

public int getCurrentCursorLine(EditText editText)
{    
int selectionStart = Selection.getSelectionStart(editText.getText());
Layout layout = editText.getLayout();

if (!(selectionStart == -1)) {
    return layout.getLineForOffset(selectionStart);
}

return -1;
}

source

答案 1 :(得分:0)

问题很久以前。但我想帮助到达这里的人们。以下是我研究java.util.regex.Matcher API后得到的结果。祝你好运。

下面的方法将ALL行中的charater index转换为SINGLE行中的charater index。 所以你可以在android编程中使用它,比如getInLineOffsetFromStringOffset(editText.getText(),editText.getSelectionStart)

我已经在所有条件下进行了测试,例如,单行或多行(由于控制此类行为,代码的某些部分似乎很明显),因此如果您没有时间调查这些行为,您只需复制并粘贴。

注意:要根据描述的问题获得所需的结果,您只需要加一个结果即可。

public static int getInLineOffsetFromStringOffset(CharSequence src,int offset){
    Pattern p=Pattern.compile("(\r)|(\n)|(\n\r)");
    Matcher m=p.matcher(src);
    int x=offset;
    int start=0,end=0,lastEnd=0;
    if(m.find()){
        end=m.end();
        start=m.start();
        if(!(end>x))

            while(m.find()){
                lastEnd=end;
                end=m.end();
                start=m.start();
                if(end>x)
                    break;
            }
    }
    if(!(end>x)){
        lastEnd=end;
        start=src.length();
        end=src.length();
    }
    return (start<x)?-1:(x-(lastEnd));
}