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.

Foi útil?

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;
            }
        }
    }});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top