Como replicar android:editável="false" no código?
-
20-08-2019 - |
Pergunta
No layout, você pode definir o EditText
widget para ser não-editável através do android:editable attribute
.
Como posso fazer isso no código?Eu preciso fazer o EditText
widget para ser editável, dependendo das condições.
Solução
Eu acho que um InputFilter
Isso rejeita todas as mudanças é uma boa solução:
editText.setFilters(new InputFilter[] {
new InputFilter() {
public CharSequence filter(CharSequence src, int start,
int end, Spanned dst, int dstart, int dend) {
return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
}
}
});
Editar: dlazar sugeriu (abaixo) para alterar o return
para dst.subSequence(dstart, dend)
Para superar o comportamento que remove as palavras.
Outras dicas
editText.setFocusable(false);
editText.setClickable(false);
Isso garante o EditText
O controle não pode ser selecionado e focado, por isso não pode ser editado.
Eu apenas tentei isso eu mesmo,
Para desativar o texto de edição:
.setFocusable(false);
Isso também define setFocusableIntouchMode como False!
Para ativar o texto de edição:
setFocusableInTouchMode(true);
Isso também define o setFocusable como true;
A melhor maneira de fazer isso é com esta única linha de código:
textView.setKeyListener(null);
Os documentos dizem para este método:
Define o ouvinte principal a ser usado com este TextView. Isso pode ser nulo para proibir a entrada do usuário.
android:editable="false"
android:inputType="none"
em seu XML ou
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);
ou
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
Você pode tentar isso:
mEditText.setFocusable(false);
mEditText.setClickable(false);
mEditText.setFocusableInTouchMode(false);
mEditText.setLongClickable(false);
mEditText.setInputType(InputType.TYPE_NULL);
Isso desativará completamente o EditText, desativará a imprensa longa se você não deseja que o usuário abra as opções de texto de edição.
Eu não vejo um relacionado método para o atributo no EditText
de classe.No entanto, há outras coisas semelhantes que você pode usar como
android:focus/setFocusable(boolean)
ou criar outra TextView cujo
android:editable="false"
e usar setVisiblilty()
para alternar entre a
editável e não editáveis pontos de vista.Se você usar View.GONE
o usuário será
nunca se sabe que há dois EditTexts.
Se o seu sentimento ambicioso, você provavelmente poderia fazer algo com o EditText do onTextChanged
escuta como ter que reagir com um setText
.
Publicando uma nova resposta, já que não posso comentar sobre a resposta de Josef.
O filtro de entrada funciona bem, mas possui um bug sutil: digitar uma seleção excluirá todo o texto.
Por exemplo, diga que você tem o texto "foo"
no EditText
. Se você selecionar tudo (por exemplo, clicando duas vezes) e digite 'a'
, o texto desaparecerá. Isso é porque o InputFilter
será chamado como:
filter("a", 0, 1, "foo", 0, 3);
O filtro de entrada proposto retornará a sequência vazia neste caso (porque src.length() < 1
é false
), que explica o texto que falta.
A solução é simplesmente retornar dst.subSequence(dstart, dend)
na função de filtro. Isso funcionará bem, mesmo para deleções.
Você tentou setText (java.lang.charsequence, android.widget.textview.buffertype) ? É descrito como:
Define o texto que este TextView deve ser exibido (consulte SetText (CharSequence)) e também define se está armazenado em um buffer estilável/espanhável e se é editável.
(ênfase meu)
Eu acho
Edittext.setEnabled(false);
através do código
e
android:enabled="false"
Através do xml.al também verifique este post em ASSIM.
Eles devem trabalhar e você pode ativar novamente programaticamente Edittext.setEnabled(true);
Eu também queria apontar uma solução alternativa que funcione bem se você estiver criando novas instâncias de um EditView. Você pode substituir o método getDeFaultEditable (), conforme sugerido pelos documentos, para retornar false. Por exemplo
EditText view = new EditText(DiscountCalculator.this) {
public boolean getDefaultEditable() {
return false;
}
};
A única solução que encontrei para esse cenário é criar 2 layouts. Um é editável e um não é. Você pode ter que criar mais de 2 layouts com base em várias condições. Armazene as condições em SharedPreferências ou outros meios e carregue o layout relevante com base nas condições após reiniciar a atividade. Aqui está um exemplo:
em onCreate () da atividade:
configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
manualSettingsMode = configuration.isManualSettingsMode();
if(manualSettingsMode){
setContentView(R.layout.editableconfigurationsettings);
}else {
setContentView(R.layout.configurationsettings);
}
A atividade pode ser reiniciada com base nos testes de condição e funções de chamada como:
private void setManualEditing(){
configuration.set_isManualSettingsMode(true);
this.recreate();
}
private void setAutoEditing(){
configuration.set_isManualSettingsMode(false);
this.recreate();
}
Espero que isto ajude. Realmente tem que haver uma solução melhor, mas é isso que eu tenho feito. Idealmente, seria possível fazer isso em campos individuais e não precisaria recarregar a atividade / layouts. -Bobby
Eu acho que a maneira correta de alcançar o efeito desejado é:
mEditView.setText("my text", BufferType.NORMAL);
Se você deseja alternar entre editável e não editável, você pode fazer o seguinte:
// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);
// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);
Experimente isso:
mEditText.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (XXX) {
return "";
} else {
return null;
}
}
}});