【发布时间】:2021-08-24 21:59:16
【问题描述】:
我正在寻找一种将光标移动到特定行的方法,例如 150
将光标移动到我们使用的特定位置
edittext.setSelection(pos);
但是移动到另一行呢?我们假设第 150 行
【问题讨论】:
标签: java android android-edittext android-cursor
我正在寻找一种将光标移动到特定行的方法,例如 150
将光标移动到我们使用的特定位置
edittext.setSelection(pos);
但是移动到另一行呢?我们假设第 150 行
【问题讨论】:
标签: java android android-edittext android-cursor
这是一个 Kotlin sn-p:
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,offsetForHorizontal+5)
但是,您可以获得行的字符索引(整个文本中行的开始和结束索引),如下所示
val startIndex = editText.layout.getLineStart(lineCount - 1)
val endIndex = editText.layout.getLineEnd(lineCount - 1)
P.S:您可以在 getOffsetForHorizontal() 中指定任何行来设置您的选择,而不是移动到最后一行
光标移动到最后一行 30 f 偏移量(最近的字符在 给定偏移量)
【讨论】:
我认为没有直接的方法,但 nth 行意味着 nth 出现换行符 (\n),因此您可以找到该索引并使用 setPosition 对其
在this function 中,我们使用while 循环n 使用indexOf 来查找nth 换行符
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);
}
【讨论】: