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

问题描述

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

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

edittext.setSelection(pos);

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

解决方法

我认为没有直接的方法,但是 nth line 表示 nth 次出现换行符 (\n) 所以你可以找到那个索引并使用 setPosition给它

this function 中,我们使用 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() 方法获取编辑文本中的行数。由于布局的换行或用户指定的换行符,这将返回存在的总行数。也就是说,即使你的输入是一个很长的段落,没有 \n s,你也会得到总行数作为内部换行算法的结果。

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

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

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

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

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

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

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

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

这是折叠光标。如果您需要在特定行中选择一个范围内的字符,请多说 5 个字符,但前提是您知道字符数,您可以这样做

// assuming selection is at the beginning of the line

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

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

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

P.S:您可以在 getOffsetForHorizo​​ntal() 中指定任何行来设置您的选择,而不是移动到最后一行

Cursor Initially in first line

光标移动到最后一行,偏移量为 30 f(最近的字符在 给定的偏移量)

Cursor moved to last line