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?
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?
Respostas:
Onde position é um int:
editText1.setSelection(position)
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);
etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
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);
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 EditText
quando sua atividade é aberta? Nesse caso, a sua requestFocus()
use a linha abaixo
e2.setSelection(e2.length());
e2
é editar texto Nome do objeto
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.
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());
}
});
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:
Portanto, se você quiser o cursor no final do texto, apenas defina-o yourEditText.length()
.
como lembrete: se você estiver usando edittext.setSelection()
para definir o cursor, e NÃO estiver funcionando durante a configuração de, alertdialog
por 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);
Este código o ajudará a mostrar o cursor na última posição da edição de texto.
editText.requestFocus();
editText.setSelection(editText.length());
Lembre-se de ligar requestFocus()
antes setSelection
para o edittext.
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);
Se você deseja definir o cursor após o n
caractere 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>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
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 xgetIndexFromPos(x, -1)
Vá para a última coluna da linha xgetIndexFromPos(-1, y)
Vá para a coluna y da última linhagetIndexFromPos(-1, -1)
Vá para a última coluna da última linhaTodos 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()
.
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);
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);
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