Come impostare la posizione del cursore in EditText?


235

Ci sono due EditText, durante il caricamento della pagina un testo è impostato nel primo EditText, quindi ora il cursore sarà nella posizione iniziale di EditText, voglio impostare la posizione del cursore nel secondo EditText che non contiene dati. Come fare questo?


2
puoi impostare la sua gravità su "center". imposta automaticamente il cursore in posizione centrale. allora anche il tuo testo verrebbe centrato.
Hiral Vadodaria,

prima di tutto, prova a migliorare il rapporto di accettazione. secondo, cosa intendi impostando la posizione del cursore, quando non c'è testo in edittext?
Vladimir

Risposte:



96

Ho fatto in questo modo per impostare la posizione del cursore alla fine del testo dopo aver aggiornato il testo di EditText a livello di codice qui, etmsgè EditText

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

4
+1 ah! Bello, mi ha aiutato a impostare la posizione del cursore in edittext.
Dharmendra,

2
Questo non ha funzionato per me. Ho stringhe Spannable nel mio EditText. C'è una soluzione per questo?
toobsco42

1
@ toobsco42 Ciao, ho appena provato a usare Spannable String in edittext .. controlla questo pastebin.com/i02ZrNw4 e funziona come previsto come dovrebbe essere .. controlla e confronta
MKJParekh

Questo è possibile dal file xml? @MKJParekh
Yog Guru

1
Sembra fare lo stesso:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell,

37

Come impostare la posizione del cursore EditText in Android

Sotto il codice è impostato il cursore su Avvio in EditText:

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

Sotto il codice è impostato il cursore alla fine del EditText:

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

Sotto il codice è impostato il cursore dopo una posizione del 2 ° carattere:

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

17

Voglio impostare la posizione del cursore in edittext che non contiene dati

C'è solo una posizione in un EditText vuoto, lo è setSelection(0).

O volevi dire che vuoi concentrarti sul tuo EditTextquando la tua attività si apre? In quel caso è requestFocus()


setSelection (0) non funziona, non voglio concentrarmi sul secondo EditText, voglio solo impostare il cursore nel secondo EditText
nila

3
Se ricordo bene, quando un EditText richiede lo stato attivo, il cursore è impostato. Leggi questo
Reno,


9

Lascia che editText2 sia la tua seconda vista EditText. Quindi inserisci il seguente pezzo di codice in onResume ()

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

o mettere

<requestFocus />

nel layout XML della seconda vista EditText.


7

qualche volta il cursore di testo di modifica donot arriva in una posizione particolare è se usiamo direttamente editText.setSelection(position);. In tal caso puoi provare

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

7

Se si desidera posizionare il cursore in una determinata posizione su un EditText, è possibile utilizzare:

yourEditText.setSelection(position);

Inoltre, c'è la possibilità di impostare la posizione iniziale e finale, in modo da selezionare a livello di codice del testo, in questo modo:

yourEditText.setSelection(startPosition, endPosition);

Si noti che l'impostazione della selezione potrebbe essere complicata poiché è possibile posizionare il cursore prima o dopo un carattere, l'immagine seguente spiega come indicizzare le operazioni in questo caso:

inserisci qui la descrizione dell'immagine

Quindi, se vuoi il cursore alla fine del testo, impostalo su yourEditText.length().


5

setSelection(int index)Il metodo in Edittextdovrebbe consentirti di farlo.


4

come promemoria: se si utilizza edittext.setSelection()per impostare il cursore e NON funziona durante la configurazione di un alertdialogesempio, assicurarsi di impostare selection()DOPO che la finestra di dialogo è stata creata

esempio:

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

3

Questo codice ti aiuterà a mostrare il cursore nell'ultima posizione di modifica del testo.

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

2

Ricorda di chiamare requestFocus()prima setSelectionper edittext.


1

Non otterrò direttamente il metodo setSelection (), quindi ho fatto come sotto e lavoro come un incantesimo

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

1

Se vuoi impostare il cursore dopo il ncarattere da destra a sinistra, devi fare così.

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

Se il testo di edittext piace

version<sub></sub>

e vuoi spostare il cursore in sesta posizione da destra

Quindi sposta il cursore su-

    version<sub> </sub>
                ^

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

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

0

Imposta il cursore su una riga e una colonna

È possibile utilizzare il seguente codice per ottenere la posizione in EditText che corrisponde a una determinata riga e colonna. È quindi possibile utilizzare editText.setSelection(getIndexFromPos(row, column))per impostare la posizione del cursore. È possibile effettuare le seguenti chiamate al metodo:

  • getIndexFromPos(x, y) Vai alla colonna y della riga x
  • getIndexFromPos(x, -1) Vai all'ultima colonna della riga x
  • getIndexFromPos(-1, y) Vai alla colonna y dell'ultima riga
  • getIndexFromPos(-1, -1) Vai all'ultima colonna dell'ultima riga

Vengono gestiti tutti i limiti di linea e colonna; L'immissione di una colonna maggiore della lunghezza della linea restituirà la posizione nell'ultima colonna della linea. L'immissione di una riga maggiore del conteggio delle righe di EditText andrà all'ultima riga. Dovrebbe essere abbastanza affidabile in quanto è stato pesantemente testato.

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

Alla domanda era già stata data una risposta, ma ho pensato che qualcuno avrebbe voluto farlo.

Funziona ciclicamente attraverso ogni carattere, incrementando il conteggio delle righe ogni volta che trova un separatore di linee. Quando il conteggio delle righe è uguale alla riga desiderata, restituisce l'indice corrente + la colonna o l'indice di fine riga se la colonna è fuori dai limiti. Puoi anche riutilizzare il getTrueLineCount()metodo, restituisce un conteggio di riga ignorando il ritorno a capo del testo, a differenza TextView.getLineCount().


0

In kotlin, puoi creare una funzione di estensione come questa:

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

e poi chiama semplicemente myEditText.placeCursorAtLast()


0

Se si desidera impostare la posizione del cursore in EditText? prova questi sotto il codice

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

0

Come risolvere il problema della posizione del cursore che si sposta automaticamente sull'ultima posizione dopo la formattazione in US Mobile come (xxx) xxx-xxxx in Android.

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

Definire il metodo seguente per qualsiasi Activityclass nel mio caso Il nome dell'attività è AppUtil e accedervi a livello globale

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

E se vuoi impostare una posizione specifica

edittext.setSelection(position);

-3

Credo che il modo più semplice per farlo sia usare solo l'imbottitura.

Di 'nella sezione edittext del tuo xml, aggiungi android: paddingLeft = "100dp" Questo sposta la posizione iniziale del cursore di 100dp a destra dall'estremità sinistra.

Allo stesso modo, puoi usare android: paddingRight = "100dp" Questo sposta la posizione finale del cursore di 100dp a sinistra dall'estremità destra.

Per maggiori dettagli, consulta questo articolo sul mio blog : Android: impostazione della posizione iniziale e finale del cursore nel widget EditText


2
L'imbottitura non ha nulla a che fare con la posizione del cursore ed è una scuola di pensiero completamente sbagliata in questa particolare situazione.
Squalo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.