Eu tenho uma situação, onde existem dois campos. field1
e field2
. Tudo o que quero fazer é vazio field2
quandofield1
é alterado e vice-versa. Portanto, no final, apenas um campo tem conteúdo.
field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);
field1.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field2.setText("");
}
});
field2.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
field1.setText("");
}
});
Ele funciona muito bem se eu anexar addTextChangedListener
a field1
única, mas quando eu faço isso para ambos os campos do aplicativo falha. Obviamente, porque eles tentam mudar um ao outro indefinidamente. Depois que as field1
alterações forem apagadas field2
, neste momento, as
field2
alterações serão alteradas, para quefield1
e assim por diante ...
Alguém pode sugerir alguma solução?
starting waiting blocking gc alloc
esse tipo de erro, que pode até causar travamentos e travamentos. seguro e recomendado pelo google agora ..Respostas:
Você pode adicionar uma verificação para limpar somente quando o texto no campo não estiver vazio (ou seja, quando o comprimento for diferente de 0).
Documentação para
TextWatcher
aqui .Também respeite as convenções de nomenclatura .
fonte
Eu sei que isso é antigo, mas alguém pode se deparar com isso novamente algum dia.
Eu tive um problema semelhante em que chamaria setText em um EditText e onTextChanged seria chamado quando não quisesse. Minha primeira solução foi escrever um código depois de chamar setText () para desfazer o dano causado pelo ouvinte. Mas isso não era muito elegante. Depois de fazer algumas pesquisas e testes, descobri que o uso de getText (). Clear () limpa o texto da mesma maneira que setText (""), mas como não está definindo o texto, o ouvinte não é chamado, de modo que resolveu meu problema. Troquei todas as minhas chamadas setText ("") para getText (). Clear () e não precisei mais das ataduras, portanto, talvez isso também resolva o seu problema.
Tente o seguinte:
fonte
Se você estiver usando o Kotlin para desenvolvimento Android, poderá adicionar
TextChangedListener()
usando este código:fonte
Um pouco atrasado de uma resposta, mas aqui está uma solução reutilizável:
Portanto, quando o descrito acima é usado, todas as
setText()
chamadas realizadas no TextWatcher não resultam na chamada do TextWatcher novamente:fonte
Também enfrentei o mesmo problema e continuo obtendo
stackOverflow
exceções e venho com a seguinte solução.declarado inicialmente bipeano skipOnChange = false;
fonte
Você também pode usar o método hasFocus ():
Testei isso para um trabalho na faculdade em que eu estava trabalhando para converter escalas de temperatura conforme o usuário as digitava. Funcionou perfeitamente e é muito mais simples.
fonte
marque String antes de definir outro
EditText
como vazio. seField1
estiver vazio, por que precisar mudar novamente para ("")? para que você possa verificar o tamanho da sua string com s.lenght () ou qualquer outra soluçãoOutra maneira de verificar o comprimento da String é:
fonte
Eu escrevi minha própria extensão para isso, muito útil para mim. (Kotlin)
Você pode escrever apenas assim:
Minha extensão:
fonte
neste código, noteid é basicamente argumentos retirados, que estão sendo colocados no recuo ou passados pelo recuo.
o código do lado negativo é basicamente o código extra, se você quiser entender mais claramente.
Com o novo código de atividade chamado NoteEditor.java para fins de edição, meu aplicativo é basicamente o aplicativo de anotações.
fonte
No Kotlin, basta usar a função de extensão KTX : (Utiliza
TextWatcher
)importação
core-KTX
:fonte
Podemos remover o TextWatcher de um campo antes de editar seu texto e adicioná-lo novamente após editar o texto.
Declare os Observadores de Texto para o campo1 e o campo2 como variáveis separadas para dar um nome a eles: por exemplo, para o campo1
adicione o observador usando seu nome:
field1.addTextChangedListener(Field_1_Watcher)
para o campo1 efield2.addTextChangedListener(Field_2_Watcher)
para o campo2Antes de alterar o texto do campo2 , remova o TextWatcher:
field2.removeTextChangedListener(Field_2_Watcher)
altere o texto:field2.setText("")
adicione o TextWatcher novamente:
field2.addTextChangedListener(Field_2_Watcher)
Faça o mesmo para o outro campo
fonte
Adicione plano de fundo dinamicamente no
onCreate
método:Também remova o plano de fundo do XML.
fonte