如何使用 java 将光标移动到 Edittext 中的特定行

how to move the cursor to a specific Line in Edittext using java

我正在寻找一种将光标移动到特定行的方法,例如 150

将光标移动到我们使用的特定位置

edittext.setSelection(pos);

但是移动到另一条线呢?我们假设第 150

我认为没有直接的方法,但是 nth line 意味着第 nth occurrence of newline (\n) 所以你可以找到那个索引并使用 setPosition 到它

this function 中,我们使用 while 循环 n 次,使用 indexOf 找到第 n 次出现的换行符

public static int ordinalIndexOf(String str, String substr, int n) {
    int pos = str.indexOf(substr);
    while (--n > 0 && pos != -1)
        pos = str.indexOf(substr, pos + 1);
    return pos;
}

然后我们可以将该索引用于 setPosition。请注意,如果我们想转到该行,我们应该在 \n 之后进行,因此我们将 +1 添加到我们找到的 position

int n = 150;

if( n <= 0 ){
    edittext.setSelection(0);
} else {
    int position = ordinalIndexOf(edittext.getText().toString(), "\n", n);

    if(position != -1)
        edittext.setSelection(position + 1);
}

这是一个 Kotlin 片段:

 val lineCount = editText.layout.lineCount

您可以使用 getLineCount() 方法获取编辑文本中的行数。 returns 由于布局的换行或用户指定的换行符而出现的总行数。也就是说,即使你输入的是一个很长的段落,没有 \n s,你也会得到总行数作为内部换行算法的结果。

确保 editText.getLayout 在获取行数之前不为空。如果为null,可以调用edittext的measure()方法。

布局中的行具有基于 0 的索引。所以它从第 0 行开始到第 n-1 行,共 n 行。

val offsetForHorizontal = editText.layout.getOffsetForHorizontal(lineCount-1, 0f)

这 returns 给定行的字符起始索引/字符偏移量。

第一个参数是您要放置光标的行。 第二个浮点数是您要放置的位置的 x 偏移量。光标在指定的行上。 在这里,我给了 0f,所以它将光标放在行的开头。 如果你想要它在最后,然后计算线的宽度并将其提供给你的偏移量。

val lineWidth = editText.layout.getLineWidth(lineCount-1)

现在要将光标设置在特定行,请使用

Selection.setSelection(editText.text,offsetForHorizontal,offsetForHorizontal)

这是折叠的光标。如果您需要 select 处理特定行中的一系列字符,请再说 5 个字符,但前提是您知道字符数,您可以这样做

// assuming selection is at the beginning of the line

Selection.setSelection(editText.text,offsetForHorizontal,offsetForHorizontal+5)

但是,您可以获得行的字符索引(整个文本中行的开始和结束索引),如下所示

val startIndex = editText.layout.getLineStart(lineCount - 1)
val endIndex = editText.layout.getLineEnd(lineCount - 1)

P.S:您可以指定任何行来设置您的 selection in getOffsetForHorizo​​ntal()[=19,而不是移动到最后一行=]

Cursor moved to last line with 30 f offset(the nearest character at the give offset)