如何在EditText中设置光标位置?

时间:2011-11-07 10:21:42

标签: android android-edittext

有两个EditText,在加载页面时,第一个EditText中设置了一个文本,所以现在光标将位于EditText的起始位置,我想设置光标位置在第二个EditText 中,它不包含任何数据。怎么做?

24 个答案:

答案 0 :(得分:432)

where position是int:

editText1.setSelection(position)

答案 1 :(得分:92)

我已经这样做了以编程方式更新EditText文本后将光标位置设置为文本末尾 在这里,etmsg是EditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);

答案 2 :(得分:31)

如何在Android

中设置EditText光标位置

以下代码<{>>将光标设置为EditText中的:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);

代码下方将光标设置为EditText 的结尾

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());

以下代码是在第2个字符位置后设置光标:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(2);

答案 3 :(得分:14)

  

我想在edittext中设置不包含数据的光标位置

空的EditText只有一个位置,它是setSelection(0)

或者您的意思是您希望在活动开始时将注意力集中在EditText上?在那种情况下,它是requestFocus()

答案 4 :(得分:11)

使用以下行

e2.setSelection(e2.length());

e2是编辑文本对象名称

答案 5 :(得分:9)

让editText2成为你的第二个EditText视图。然后将以下代码放入 onResume()

editText2.setFocusableInTouchMode(true);
editText2.requestFocus();

或放

<requestFocus />

在第二个EditText视图的xml布局中。

答案 6 :(得分:6)

如果我们直接使用editText.setSelection(position);,有些时候编辑文本光标不会出现在特定位置。 在这种情况下,您可以尝试

editText.post(new Runnable() {
                @Override
                public void run() {
                    editText.setSelection(string.length());
                }
            });

答案 7 :(得分:5)

<{1}}中的

setSelection(int index)方法应该允许您执行此操作。

答案 8 :(得分:4)

作为提醒:如果您使用edittext.setSelection()来设置光标,并且在设置alertdialog时它不起作用,请务必在selection()之后设置AlertDialog dialog = builder.show(); input.setSelection(x,y); 对话框已创建

示例:

{{1}}

答案 9 :(得分:3)

此代码可帮助您将光标显示在编辑文本的最后位置。

 editText.requestFocus();
 editText.setSelection(editText.length());

答案 10 :(得分:2)

请务必在编辑文字requestFocus()之前致电setSelection

答案 11 :(得分:2)

如果要将光标放在EditText上的某个位置,可以使用:

yourEditText.setSelection(position);

此外,还可以设置初始位置和最终位置,以便您以编程方式选择一些文本,

yourEditText.setSelection(startPosition, endPosition);

请注意,由于您可以将光标放置在字符前 后,设置选择项可能会比较棘手,下图说明了在这种情况下如何建立索引:

enter image description here

因此,如果您希望光标位于文本的末尾,只需将其设置为yourEditText.length()

答案 12 :(得分:1)

  

我不会直接得到setSelection()方法,所以我就像下面这样做了   像魅力一样工作

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setText("Updated New Text");
int position = editText.getText().length();
Editable editObj= editText.getText();
Selection.setSelection(editObj, position);

答案 13 :(得分:1)

如果要在n字符之后设置光标 从右到左然后你必须这样做。

edittext.setSelection(edittext.length()-n);

如果edittext的文字像

那样
version<sub></sub>

并且您想要将光标从右侧移动到第6个位置

然后它会将光标移动到 -

    version<sub> </sub>
                ^

答案 14 :(得分:1)

您可以这样使用:

if (your_edittext.getText().length() > 0 ) {

    your_edittext.setSelection(your_edittext.getText().length());
}

您可以将此行添加到您的EditText xml

android:gravity="right"
android:ellipsize="end"
android:paddingLeft="10dp"//you set this as you need

但是在编写任何文本时,应将paddingleft设置为零

您应该在addTextChangedListener上使用它

答案 15 :(得分:1)

EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());

答案 16 :(得分:1)

if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }

答案 17 :(得分:0)

我来回答这个问题太晚了,所以我弄清楚了。只需使用

android:gravity="center_horizontal"

答案 18 :(得分:0)

如何解决光标位置问题,该问题在美国移动电话中格式化后会自动移动到最后一个位置,例如Android中的(xxx)xxx-xxxx。

private String oldText = "";
private int lastCursor;
private EditText mEtPhone;

@Override
    public void afterTextChanged(Editable s) {
String cleanString = AppUtil.cleanPhone(s.toString());

String format = cleanString.length() < 11 ? cleanString.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3") :
                cleanString.substring(0, 10).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");


boolean isDeleted = format.length() < oldText.length();

        try {

            int cur = AppUtil.getPointer(lastCursor, isDeleted ? s.toString() : format, oldText, isDeleted);
            mEtPhone.setSelection(cur > 0 ? cur : format.length());

        }catch (Exception e){
            e.printStackTrace();
            mEtPhone.setSelection(format.length());
        }

        mEtPhone.addTextChangedListener(this);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        oldText = s.toString();
        lastCursor = start;
    }

在我的案例中,将以下方法定义为任何Activityclass活动名称为AppUtil并全局访问它

public static int getPointer(int index, String newString, String oldText, boolean isDeleted){

        int diff = Math.abs(newString.length() - oldText.length());

        return diff > 1 ? isDeleted ? index - diff : index  + diff : isDeleted ? index : index + 1;
    }

public static String cleanPhone(String phone){

        if(TextUtils.isEmpty(phone))
            return "";

        StringBuilder sb = new StringBuilder();
        for(char c : phone.toCharArray()){
            if(Character.isDigit(c))
                sb.append(c);
        }
        return sb.toString();
    }

如果要设置任何特定位置

edittext.setSelection(position);

答案 19 :(得分:0)

是否要在EditText中设置光标位置?试试下面的代码

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);

答案 20 :(得分:0)

将光标设置为行和列

您可以使用以下代码获取EditText中与某个行和列对应的位置。然后,您可以使用editText.setSelection(getIndexFromPos(row, column))设置光标位置。 可以对该方法进行以下调用:

  • getIndexFromPos(x, y)转到第x行的第y列
  • getIndexFromPos(x, -1)转到第x行的最后一列
  • getIndexFromPos(-1, y)转到最后一行的第y列
  • getIndexFromPos(-1, -1)转到最后一行的最后一列

处理所有行和列边界;输入大于行长度的列将返回该行最后一列的位置。输入大于EditText的行数的行将转到最后一行。它经过严格测试后应该足够可靠。

static final String LINE_SEPARATOR = System.getProperty("line.separator");

int getIndexFromPos(int line, int column) {
    int lineCount = getTrueLineCount();
    if (line < 0) line = getLayout().getLineForOffset(getSelectionStart());  // No line, take current line
    if (line >= lineCount) line = lineCount - 1;  // Line out of bounds, take last line

    String content = getText().toString() + LINE_SEPARATOR;
    int currentLine = 0;
    for (int i = 0; i < content.length(); i++) {
        if (currentLine == line) {
            int lineLength = content.substring(i, content.length()).indexOf(LINE_SEPARATOR);
            if (column < 0 || column > lineLength) return i + lineLength;  // No column or column out of bounds, take last column
            else return i + column;
        }
        if (String.valueOf(content.charAt(i)).equals(LINE_SEPARATOR)) currentLine++;
    }
    return -1;  // Should not happen
}

// Fast alternative to StringUtils.countMatches(getText().toString(), LINE_SEPARATOR) + 1
public int getTrueLineCount() {
    int count;
    String text = getText().toString();
    StringReader sr = new StringReader(text);
    LineNumberReader lnr = new LineNumberReader(sr);
    try {
        lnr.skip(Long.MAX_VALUE);
        count = lnr.getLineNumber() + 1;
    } catch (IOException e) {
        count = 0;  // Should not happen
    }
    sr.close();
    return count;
}

这个问题已经回答,但我认为有人可能会这样做。

它通过循环遍历每个字符来工作,每次找到行分隔符时递增行数。当行计数等于所需行时,它将返回当前索引+列,如果列超出范围,则返回行结束索引。您还可以重复使用getTrueLineCount()方法,它会返回忽略文本换行的行数,而不是TextView.getLineCount()

答案 21 :(得分:-1)

在kotlin中,你可以创建一个像这样的扩展函数:

fun EditText.placeCursorAtLast() {
    val string = this.text.toString()
    this.setSelection(string.length)
}

然后只需致电myEditText.placeCursorAtLast()

答案 22 :(得分:-2)

我认为最简单的方法就是使用填充。

在你的xml的edittext部分中说,添加     机器人:paddingLeft = “100dp” 这会将光标100dp的起始位置从左端移动。

同样,你可以使用     机器人:paddingRight = “100dp” 这会将光标100dp的结束位置从右端移开。

有关详细信息,请查看我的博客上的文章Android: Setting Cursor Starting and Ending Position in EditText Widget

答案 23 :(得分:-4)

在Xml文件中android:paddingLeft:

<EditText
    android:id="@+id/txt_amount"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"/>

我希望这对您有帮助