Wie setze ich die Cursorposition in EditText?

235

Es gibt zwei EditTextMöglichkeiten, während beim Laden der Seite ein Text im ersten EditText gesetzt wird. Jetzt befindet sich der Cursor an der Startposition von EditText. Ich möchte die Cursorposition im zweiten EditText setzen, der keine Daten enthält. Wie macht man das?

Nila
quelle
2
Sie können die Schwerkraft auf "Mitte" setzen. Der Cursor wird automatisch auf "Mitte" gesetzt. Ihr Text würde dann auch zentriert sein.
Hiral Vadodaria
Versuchen Sie zunächst, Ihr Akzeptanzverhältnis zu verbessern. zweitens, was meinst du mit dem Setzen der Cursorposition, wenn der Text keinen Text enthält?
Vladimir

Antworten:

483

Wo Position ein int ist:

editText1.setSelection(position)
NotACleverMan
quelle
Gibt es eine Möglichkeit, dies in der XML-Datei zu tun?
Kike
@ Kike Ich glaube nicht
Atasoyh
1
Verwenden Sie Android: Auswahl in XML mit Datenbindung
Mubarak Mohideen
95

Ich habe auf diese Weise die Cursorposition auf das Ende des Textes gesetzt, nachdem der Text von EditText hier programmgesteuert aktualisiert wurde. Diesetmsg ist EditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
MKJParekh
quelle
4
+1 ah! Schön, dass es mir geholfen hat, die Cursorposition in edittext zu setzen.
Dharmendra
2
Das hat bei mir nicht funktioniert. Ich habe Spannable Strings in meinem EditText. Gibt es dafür eine Problemumgehung?
toobsco42
1
@ toobsco42 Hallo, ich habe gerade versucht, Spannable String in edittext zu verwenden .. überprüfen Sie diese pastebin.com/i02ZrNw4 und es funktioniert wie erwartet, wie es sein sollte .. überprüfen und vergleichen
MKJParekh
Kann dies aus einer XML-Datei möglich sein? @ MKJParekh
Yog Guru
1
Scheint dasselbe zu tun:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell
37

So legen Sie die Position des EditText-Cursors in Android fest

Unterhalb des Codes befindet sich der Cursor auf Start in EditText:

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

Unterhalb des Codes befindet sich der Cursor auf das Ende des EditText:

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

Unterhalb des Codes befindet sich der Cursor nach einer 2. Zeichenposition:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(2);
IntelliJ Amiya
quelle
17

Ich möchte die Cursorposition in edittext setzen, das keine Daten enthält

Es gibt nur eine Position in einem leeren EditText setSelection(0).

Oder meinten Sie, Sie möchten sich beim Öffnen EditTextIhrer Aktivität auf Ihre konzentrieren ? In diesem Fall ist es requestFocus()

Reno
quelle
setSelection (0) funktioniert nicht, ich möchte mich nicht auf den zweiten EditText konzentrieren, ich möchte nur den Cursor im zweiten EditText setzen
nila
3
Wenn ich mich richtig erinnere, wird der Cursor gesetzt, wenn ein EditText den Fokus anfordert. Lesen Sie dies
Reno
12

Verwenden Sie die folgende Zeile

e2.setSelection(e2.length());

e2 ist Text bearbeiten Objektname

Syed Danish Haider
quelle
9

Lassen Sie editText2 Ihre zweite EditText-Ansicht sein. Fügen Sie dann den folgenden Code in onResume () ein.

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

oder setzen

<requestFocus />

in Ihrem XML-Layout der zweiten EditText-Ansicht.

Monish George
quelle
7

Einige Zeit bearbeiten Textcursor nicht an einer bestimmten Position kommt, wenn wir direkt verwenden editText.setSelection(position);. In diesem Fall können Sie es versuchen

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

Wenn Sie den Cursor an einer bestimmten Position in einem EditText platzieren möchten, können Sie Folgendes verwenden:

yourEditText.setSelection(position);

Darüber hinaus besteht die Möglichkeit, die Anfangs- und Endposition so festzulegen, dass Sie programmgesteuert Text auswählen:

yourEditText.setSelection(startPosition, endPosition);

Bitte beachten Sie, dass das Festlegen der Auswahl schwierig sein kann, da Sie den Cursor vor oder nach einem Zeichen platzieren können. In der folgenden Abbildung wird erläutert, wie die Indizierung in diesem Fall funktioniert:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie also den Cursor am Ende des Textes haben möchten, setzen Sie ihn einfach auf yourEditText.length().

Junior Damacena
quelle
5

setSelection(int index)Methode in Edittextsollte es Ihnen ermöglichen, dies zu tun.

Avinash
quelle
4

edittext.setSelection()Zur Erinnerung: Wenn Sie den Cursor zum Setzen verwenden und dieser beispielsweise beim Einrichten NICHT funktioniert alertdialog, stellen Sie sicher, dass Sie den selection()NACH dem Erstellen des Dialogfelds einstellen

Beispiel:

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

Mit diesem Code können Sie Ihren Cursor an der letzten Position der Textbearbeitung anzeigen.

 editText.requestFocus();
 editText.setSelection(editText.length());
Kailas Bhakade
quelle
2

Denken Sie daran, requestFocus()vorher setSelectionfür edittext anzurufen.

Dong Thang
quelle
1

Ich werde die setSelection () -Methode nicht direkt erhalten, also habe ich es wie unten beschrieben gemacht und arbeite wie ein Zauber

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);
sujith s
quelle
1

Wenn Sie den Cursor nach dem nZeichen von rechts nach links setzen möchten, müssen Sie dies tun.

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

Wenn der Text von edittext gefällt

version<sub></sub>

und Sie möchten den Cursor an der 6. Position von rechts bewegen

Dann bewegt es den Cursor auf

    version<sub> </sub>
                ^
Rasel
quelle
1
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Satendra Behre
quelle
1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }
MSilva
quelle
0

Setzen Sie den Cursor auf eine Zeile und eine Spalte

Mit dem folgenden Code können Sie die Position in Ihrem EditText ermitteln, die einer bestimmten Zeile und Spalte entspricht. Sie können dann editText.setSelection(getIndexFromPos(row, column))die Cursorposition einstellen. Die Methode kann folgendermaßen aufgerufen werden:

  • getIndexFromPos(x, y) Gehen Sie zur Spalte y der Zeile x
  • getIndexFromPos(x, -1) Gehen Sie zur letzten Spalte der Zeile x
  • getIndexFromPos(-1, y) Gehen Sie zur Spalte y der letzten Zeile
  • getIndexFromPos(-1, -1) Gehen Sie zur letzten Spalte der letzten Zeile

Alle Zeilen- und Spaltengrenzen werden behandelt. Wenn Sie eine Spalte eingeben, die größer als die Zeilenlänge ist, wird die Position in der letzten Spalte der Zeile zurückgegeben. Wenn Sie eine Zeile eingeben, die größer als die Zeilenanzahl des EditText ist, wird die letzte Zeile angezeigt. Es sollte zuverlässig genug sein, da es stark getestet wurde.

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;
}

Die Frage wurde bereits beantwortet, aber ich dachte, jemand könnte das stattdessen tun wollen.

Dabei werden die einzelnen Zeichen durchlaufen und die Zeilenanzahl jedes Mal erhöht, wenn ein Zeilentrennzeichen gefunden wird. Wenn die Zeilenanzahl der gewünschten Zeile entspricht, wird der aktuelle Index + die Spalte oder der Zeilenendindex zurückgegeben, wenn die Spalte außerhalb der Grenzen liegt. Sie können die getTrueLineCount()Methode auch wiederverwenden. Im Gegensatz dazu wird eine Zeilenanzahl zurückgegeben, bei der der Textumbruch ignoriert wird TextView.getLineCount().

Nicolas
quelle
0

In Kotlin können Sie eine Erweiterungsfunktion wie folgt erstellen:

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

und dann einfach anrufen myEditText.placeCursorAtLast()

notdrone
quelle
0

Wenn Sie die Cursorposition in EditText setzen möchten? Versuchen Sie diesen folgenden Code

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

So beheben Sie das Problem mit der Cursorposition, das nach dem Formatieren in US Mobile wie (xxx) xxx-xxxx in Android automatisch an die letzte Position verschoben wird.

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;
    }

Definieren Sie die folgende Methode für jede Aktivitätsklasse in meinem Fall. Der Aktivitätsname lautet AppUtil und greifen Sie global darauf zu

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();
    }

Und wenn Sie eine bestimmte Position festlegen möchten

edittext.setSelection(position);
Jai Prakash
quelle
-2

Ich glaube, der einfachste Weg, dies zu tun, ist nur die Polsterung.

Sagen Sie im Edittext-Bereich Ihrer XML, fügen Sie android hinzu: paddingLeft = "100dp" Dadurch wird Ihre Startposition des Cursors 100dp vom linken Ende nach rechts verschoben.

Genauso können Sie Android verwenden: paddingRight = "100dp" Dies verschiebt Ihre Endposition des Cursors 100dp vom rechten Ende nach links.

Weitere Informationen finden Sie in diesem Artikel in meinem Blog : Android: Festlegen der Start- und Endposition des Cursors im EditText-Widget

Arthur Wang
quelle
2
Das Auffüllen hat nichts mit der Cursorposition zu tun und ist in dieser speziellen Situation eine völlig falsche Denkrichtung.
Hai