ChatGPT解决这个技术问题 Extra ChatGPT

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

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

您可以将其重力设置为“中心”。它会自动将光标设置在中心。你的文字也会居中。
首先,尝试提高你的接受率。第二,当edittext中没有文本时,设置光标位置是什么意思?

N
NotACleverMan

其中位置是一个 int:

editText1.setSelection(position)

有没有办法在 XML 文件中做到这一点?
@kike 我不这么认为
在 xml 中使用 android:selection 和数据绑定
M
MKJParekh

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

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

+1啊!很好,它帮助我在edittext中设置光标位置。
这对我不起作用。我的 EditText 中有 Spannable 字符串。有解决方法吗?
@toobsco42你好,我刚刚尝试在edittext中使用 Spannable String ..检查这个 pastebin.com/i02ZrNw4 并且它按预期工作..检查并比较
这可以从 xml 文件中实现吗? @MKJParekh
似乎也这样做:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
I
IntelliJ Amiya

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

下面的代码是在 EditText将光标设置为开始

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

下面的代码是 EditTextSet cursor to end

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

下面的代码是在第二个字符位置之后设置光标:

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

M
Michael

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

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

或者您的意思是当您的活动打开时您想将注意力集中在您的 EditText 上?在这种情况下,它的 requestFocus()


setSelection(0) 不起作用,我不想将焦点放在第二个 EditText 上,我只想将光标设置在第二个 EditText 中
如果我没记错的话,当 EditText 请求焦点时,会设置光标。 Read this
m
monish george

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

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

或放

<requestFocus />

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


p
piet.t

使用下面的行

e2.setSelection(e2.length());

e2 是编辑文本对象名称


J
Junior Damacena

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

yourEditText.setSelection(position);

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

yourEditText.setSelection(startPosition, endPosition);

请注意,设置选择可能很棘手,因为您可以将光标放在字符之前或之后,下图说明了在这种情况下如何进行索引:

https://i.stack.imgur.com/NG1nc.png

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


S
Sourabh soni

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

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

R
Ravindra Kushwaha

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


P
Padma Kumar

提醒一下:如果您使用 edittext.setSelection() 设置光标,并且在设置 alertdialog 时它不起作用,请确保在创建对话框后设置 selection()

例子:

AlertDialog dialog = builder.show();
input.setSelection(x,y);

A
Anton Yuriev

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

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

V
Vinoth Krishnan

请记住在 setSelection 之前调用 requestFocus() 以获取 edittext。


S
SamiunNafis

你可以这样使用:

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 上使用它


s
sujith s

我不会直接获得 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);

R
Rasel

如果你想在 n 字符之后从右到左设置光标,那么你必须这样做。

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

如果edittext的文本喜欢

version<sub></sub>

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

然后它将光标移动到-

    version<sub> </sub>
                ^

可能这对阿拉伯语或希伯来语/用户会有所帮助,不是吗?
S
Satendra Behre
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());

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

N
Nicolas

将光标设置为行和列

您可以使用以下代码获取 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() 不同。


这段代码似乎对 multilineEditText 开发人员非常有用,但我无法应用这段代码。您提到了 x 和 y,但是定义了行和列, editText.setSelection(getIndexFromPos(getTrueLineCount(), getTrueLineCount()));这似乎不起作用并且没有调用该函数。那么,我们如何使用您的代码?
@Bay 我已经很久没有写这个答案了,当时我才刚刚开始进行android开发。但是原理看起来很简单,你应该可以调试代码
n
notdrone

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

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

然后只需调用 myEditText.placeCursorAtLast()


M
Mujahid Khan

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

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

j
jtate

如何解决在美国移动格式化后光标位置自动移动到最后一个位置的问题,如 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 定义以下方法 Activity 名称是 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);

J
Jack

我这么晚才回答这个问题,所以我想通了。只需使用,

android:gravity="center_horizontal"


他们想设置光标位置而不是edittext中文本的位置
A
Andrew Barber

我相信最简单的方法就是使用填充。

在你的 xml 的 edittext 部分说,添加 android:paddingLeft="100dp" 这会将光标的起始位置从左端向右移动 100dp。

同样,您可以使用 android:paddingRight="100dp" 这会将光标的结束位置从右端向左移动 100dp。

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


填充与光标位置无关,在这种特殊情况下是一种完全错误的思想流派。