【问题标题】:how to move the cursor to a specific Line in Edittext using java如何使用java将光标移动到Edittext中的特定行
【发布时间】:2021-08-24 21:59:16
【问题描述】:

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

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

edittext.setSelection(pos);

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

【问题讨论】:

    标签: java android android-edittext android-cursor


    【解决方案1】:

    这是一个 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:您可以在 getOffsetForHorizo​​ntal() 中指定任何行来设置您的选择,而不是移动到最后一行

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

    【讨论】:

      【解决方案2】:

      我认为没有直接的方法,但 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);
      }
      

      【讨论】:

      • 非常感谢阿明兄弟,有帮助的回答
      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多