如何使用 java 将光标移动到 Edittext 中的特定行
how to move the cursor to a specific Line in Edittext using java
我正在寻找一种将光标移动到特定行的方法,例如 150
将光标移动到我们使用的特定位置
edittext.setSelection(pos);
但是移动到另一条线呢?我们假设第 150
行
我认为没有直接的方法,但是 n
th line 意味着第 n
th 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 getOffsetForHorizontal()[=19,而不是移动到最后一行=]
Cursor moved to last line with 30 f offset(the nearest character at
the give offset)
我正在寻找一种将光标移动到特定行的方法,例如 150
将光标移动到我们使用的特定位置
edittext.setSelection(pos);
但是移动到另一条线呢?我们假设第 150
行我认为没有直接的方法,但是 n
th line 意味着第 n
th 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 getOffsetForHorizontal()[=19,而不是移动到最后一行=]
Cursor moved to last line with 30 f offset(the nearest character at the give offset)