Como definir a posição do cursor no EditText?

235

Existem dois EditText, ao carregar a página, um texto é definido no primeiro EditText. Portanto, agora o cursor estará no ponto inicial de EditText, desejo definir a posição do cursor no segundo EditText que não contém dados. Como fazer isso?

nila
fonte
2
você pode definir sua gravidade como 'center'.it define automaticamente o cursor para ficar no centro. seu texto também seria centralizado então.
Hiral Vadodaria 07/11
Antes de tudo, tente melhorar sua taxa de aceitação. segundo, o que você quer dizer com definir a posição do cursor, quando não há texto no edittext?
Vladimir

Respostas:

483

Onde position é um int:

editText1.setSelection(position)
NotACleverMan
fonte
existe alguma maneira de fazer isso no arquivo XML?
quer
@kike Acho que não
#
1
usar android: seleção em xml com ligação de dados
Mubarak Mohideen
96

Eu fiz desta maneira para definir a posição do cursor no final do texto depois de atualizar o texto do EditText programaticamente aqui, etmsgé EditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
MKJParekh
fonte
4
+1 ah! Bom, isso me ajudou a definir a posição do cursor no edittext.
Dharmendra
2
Isto não funcionou para mim. Eu tenho seqüências Spannable no meu EditText. Existe uma solução alternativa para isso?
toobsco42
1
@ toobsco42 Olá, eu apenas tentei usar Spannable de Cordas em EditText .. verificar isso pastebin.com/i02ZrNw4 e está funcionando como esperado como deve ser .. verificar e comparar
MKJParekh
Isso é possível no arquivo xml? @MKJParekh
Yog Guru
1
Parece fazer o mesmo:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
Steve Blackwell
37

Como definir a posição do cursor EditText no Android

Abaixo o código está definido como cursor para Iniciando em EditText:

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

Abaixo de Code is Set cursor to final of EditText:

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

Abaixo de Code is Set cursor após alguma posição do 2º caractere:

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

Quero definir a posição do cursor no edittext que não contém dados

Existe apenas uma posição em um EditText vazio, é setSelection(0).

Ou você quis dizer que deseja focar no seu EditTextquando sua atividade é aberta? Nesse caso, a sua requestFocus()

Reno
fonte
setSelection (0) não está funcionando, eu não quero para obter o foco para a segunda EditText, eu só quero colocar o cursor na segunda EditText
nila
3
Se bem me lembro, quando um EditText solicita foco, o cursor está definido. Leia isto
Reno
12

use a linha abaixo

e2.setSelection(e2.length());

e2 é editar texto Nome do objeto

Syed Danish Haider
fonte
9

Deixe editText2 é sua segunda visualização EditText. Em seguida, coloque o seguinte trecho de código em onResume ()

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

ou colocar

<requestFocus />

no seu layout xml da segunda visualização EditText.

monish george
fonte
7

algum tempo para editar o texto, o cursor não fica em uma posição específica, se usarmos diretamente editText.setSelection(position);. Nesse caso, você pode tentar

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

Se você deseja colocar o cursor em uma determinada posição em um EditText, você pode usar:

yourEditText.setSelection(position);

Além disso, existe a possibilidade de definir a posição inicial e final, para que você selecione programaticamente algum texto, desta maneira:

yourEditText.setSelection(startPosition, endPosition);

Observe que a configuração da seleção pode ser complicada, pois você pode posicionar o cursor antes ou depois de um caractere. A imagem abaixo explica como o índice funciona neste caso:

insira a descrição da imagem aqui

Portanto, se você quiser o cursor no final do texto, apenas defina-o yourEditText.length().

Junior Damacena
fonte
5

setSelection(int index)O método in Edittextdeve permitir que você faça isso.

Avinash
fonte
4

como lembrete: se você estiver usando edittext.setSelection()para definir o cursor, e NÃO estiver funcionando durante a configuração de, alertdialogpor exemplo, certifique-se de definir selection()APÓS a caixa de diálogo ter sido criada

exemplo:

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

Este código o ajudará a mostrar o cursor na última posição da edição de texto.

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

Lembre-se de ligar requestFocus()antes setSelectionpara o edittext.

Dong Thang
fonte
1

Eu não vou obter o método setSelection () diretamente, então eu fiz como abaixo e trabalho como charme

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
fonte
1

Se você deseja definir o cursor após o ncaractere da direita para a esquerda, faça o seguinte.

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

Se o texto do edittext como

version<sub></sub>

e você deseja mover o cursor na 6ª posição da direita

Então ele moverá o cursor em

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

Definir cursor para uma linha e coluna

Você pode usar o código a seguir para obter a posição no seu EditText que corresponde a uma determinada linha e coluna. Você pode usar editText.setSelection(getIndexFromPos(row, column))para definir a posição do cursor. As seguintes chamadas ao método podem ser feitas:

  • getIndexFromPos(x, y) Vá para a coluna y da linha x
  • getIndexFromPos(x, -1) Vá para a última coluna da linha x
  • getIndexFromPos(-1, y) Vá para a coluna y da última linha
  • getIndexFromPos(-1, -1) Vá para a última coluna da última linha

Todos os limites de linha e coluna são tratados; Inserir uma coluna maior que o comprimento da linha retornará a posição na última coluna da linha. Inserir uma linha maior que a contagem de linhas do EditText irá para a última linha. Deve ser confiável o suficiente, pois foi fortemente testado.

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

A pergunta já foi respondida, mas achei que alguém poderia querer fazer isso.

Ele funciona repetindo cada caractere, incrementando a contagem de linhas sempre que encontrar um separador de linhas. Quando a contagem de linhas é igual à linha desejada, ele retorna o índice atual + a coluna ou o índice de final de linha se a coluna estiver fora dos limites. Você também pode reutilizar o getTrueLineCount()método, ele retorna uma contagem de linhas ignorando a quebra de texto, ao contrário TextView.getLineCount().

Nicolas
fonte
0

No kotlin, você pode criar uma função de extensão como esta:

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

e então simplesmente chame myEditText.placeCursorAtLast()

notdrone
fonte
0

Se você deseja definir a posição do cursor no EditText? tente estes código abaixo

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

Como resolver o problema de posição do cursor, que é movido automaticamente para a última posição após a formatação no US Mobile, como (xxx) xxx-xxxx no 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;
    }

Defina o método abaixo para qualquer Activityclass no meu caso O nome da Activity é AppUtil e acesse-o globalmente

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 você deseja definir qualquer posição específica

edittext.setSelection(position);
Jai Prakash
fonte
-3

Acredito que a maneira mais simples de fazer isso é usar preenchimento.

Digamos que na seção edittext do seu xml, adicione android: paddingLeft = "100dp" Isso moverá sua posição inicial do cursor 100dp para a direita do lado esquerdo.

Da mesma forma, você pode usar o android: paddingRight = "100dp" Isso moverá sua posição final do cursor 100dp para a esquerda a partir da extremidade direita.

Para obter mais detalhes, consulte este artigo no meu blog : Android: definindo a posição inicial e final do cursor no widget EditText

Arthur Wang
fonte
2
O preenchimento não tem nada a ver com a posição do cursor e é uma escola de pensamento completamente errada nessa situação específica.
Tubarão