Como tornar o EditText não editável através de XML no Android?

300

Alguém pode me dizer como fazer um EditTextnão editável via XML? Tentei configurar android:editablea false, mas

  1. está obsoleto; e
  2. não funcionou.
Fran Fitzpatrick
fonte
6
Se não for editável, por que você precisaria do EditText? Não basta usar um TextView comum? E a função setEditable () também está obsoleta?
Kiki #
4
Para mim, isso faz sentido, a fim de ativar a pasta de cópia padrão para o conteúdo. Com um TextView não é possível (pelo menos não comportamento padrão)
Ixx
1
Correção: é uma má ideia. Em certas circunstâncias, a exibição se torna editável ou as opções de copiar e colar não são mais exibidas. Irá procurar outra abordagem.
Ixx
11
No meu caso, quero desabilitar temporariamente um EditText enquanto um conjunto de operações é executado e depois reativá-lo quando a operação terminar.
21812 Joe Plante
1
Esta pergunta é sobre uma preocupação legítima. Para preservar o EditTextestilo e licença de rolagem, o uso UI.setReadOnly(myEditText, true)de esta biblioteca . Existem algumas propriedades que precisam ser definidas, que você pode conferir no código-fonte .
03

Respostas:

399

Use este código simples:

textView.setKeyListener(null);

Funciona.

Editar: para adicionar KeyListenermais tarde, faça o seguinte

1: defina o ouvinte de chave como tag de textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2: obtenha o ouvinte de chave da tag e configure-o novamente para textView

textView.setKeyListener((KeyListener) textView.getTag());
Kristiono Setyadi
fonte
30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); configure-o novamente mais tarde com textView.setKeyListener ((KeyListener) textView.getTag ());
Thomas Dignan
@ TomDignan é uma ótima maneira de fazer isso facilmente! Eu tenho uma pergunta. Isso de alguma forma altera os valores padrão necessários ao KeyListener, como setFocusable()porque o documento diz que a implementação padrão pode ser alterada se alterada.
Andy
afaik não, a etiqueta deve estar disponível para você usar
Thomas Dignan
Ei, sua sugestão ajudou-me
obrigado #
38
A pergunta era sobre defini-lo via XML , por que isso está marcado como solução?
precisa saber é o seguinte
398

Adicione isso ao seu arquivo xml EditText:

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

Ele fará o mesmo efeito que android:editable="false". Trabalhou para mim, espero que funcione para você também.

GalDude33
fonte
3
notes.setKeyListener (nulo); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
precisa
3
Se você quiser fazer isso no XML ... qual será a diferença entre ele e o TextView ???
Chris Sim
11
A diferença é que ele pode ser usado comTextInputLayout
ahmadalibaloch /
2
Isso deve ser marcado como a solução, pois é uma solução XML pura, conforme solicitado na pergunta.
Zgc7009
2
Esta é obsoleto (Outubro de 2018)
Sebastian Paduano
54

Deixe seu texto de edição ser

EditText editText;

editText.setKeyListener(null);

funcionará, mas simplesmente não está ouvindo as teclas.

O usuário pode ver um cursor no edittext.

Podes tentar editText.setEnabled(false);

Isso significa que o usuário não pode ver o cursor. Simplesmente dizer que se tornará TextView.

Mahendran
fonte
3
Está correto, pois o EditText é uma subclasse do TextView. No entanto, use editText como uma variável em vez de textView.
Joe Plante
@JoePlante Alterou o nome da variável, obrigado pelo comentário construtivo.
Mahendran
isso mostra o EditText
stephen
EditText acinzentado indica que está desativado e o usuário não pode editá-lo.
Mahendran
Definir a cor e impedir a aparência acinzentada. XML: Tente android: textColor = "@ color / Black" android: enabled = "false"
Vinho Tinto
32

Como mencionado em outras respostas, você pode fazer isso, setEnabled(false) mas como você está perguntando como configurá-lo via XML, aqui está como fazê-lo.

Adicione o seguinte atributo ao seu EditText:

android:enabled="false"
vida
fonte
4
resposta exata à pergunta dos POs.
SMR
mas este método obsoleto
Lalit Kumar
2
@Lalitkumar enablednão está obsoleto. editableé.
InsanityOnABun
7
por ativar, também não podemos acessar o ouvinte de cliques. então para mim não é a resposta.
Naveed Ahmad
este é ocultar o texto :(
Chego
24

desativar do XML (uma linha):

 android:focusable="false"

reative a partir do Java, se necessário (também uma linha):

editText.setFocusableInTouchMode(true);
kouretinho
fonte
Boa resposta. Dessa forma, você ainda pode definir o valor editText usando editText.setText ("seu texto"). Mas o usuário não pode editá-lo.
Prakash
17

Eles tornaram "editável" obsoleto, mas não forneceram um correspondente correspondente em inputType.

A propósito, inputType = "none" tem algum efeito? Usá-lo ou não, não faz nenhuma diferença, tanto quanto eu vejo.

Por exemplo, o editText padrão é considerado uma linha única. Mas você precisa selecionar um inputType para que seja uma linha única. E se você selecionar "nenhum", ainda será multilinha.

Timuçin
fonte
1
Não faz diferença em todos os dispositivos, mas deve , de acordo com os documentos: developer.android.com/reference/android/widget/…
caw
12
Um belo exemplo de bagunça no Google
Yar
14

Essa combinação funcionou para mim:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>
Massimo Fazzolari
fonte
13

Como você mencionou no Android: editável está obsoleto. android: inputType = "none" deve ser usado, mas não funciona devido a um bug ( https://code.google.com/p/android/issues/detail?id=2854 )

Mas você pode conseguir a mesma coisa usando o foco.

Via XML:

<EditText ...
        android:focusable="false" 
</EditText>

Do código:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);
Adorjan Princz
fonte
Por cortesia do google, o bug se enquadra em dois cenários diferentes: 1.) Será corrigido, mas após 6 anos 2.) Nunca será corrigido, eles apenas desenvolverão uma nova versão do Android.
Neon Warge
12

se você quiser clicar nele, mas não quiser editá-lo, tente:

        android:focusable="false"
Kai Wang
fonte
8

Apenas use android:enabled="false". Isso também dará uma aparência ao EditTextque fará com que não pareça editável.

Shahid Sarwar
fonte
7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

e use o seguinte:

txtDate.setKeyListener(null);
askimp
fonte
7

Se você quiser fazê-lo em código java, use esta linha para desativá-lo:

editText.setEnabled(false);

E isso para habilitá-lo:

editText.setEnabled(true);
user3185897
fonte
5

Eu tentei fazer:

textView.setInputType( InputType.TYPE_NULL );

o que deve funcionar, mas para mim não funcionou.

Eu terminei com este código:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

o que funciona perfeitamente

sárico
fonte
4

Quando quero que uma atividade não se concentre no EditText e também não mostre o teclado quando clicada, é isso que funcionou para mim.

Adicionando atributos ao layout principal

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

e depois o campo EditText

android:focusable="false"
android:focusableInTouchMode="false"

Aqui está um exemplo:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>
Woppi
fonte
3

Além de @mahe madi, você pode tentar isso também

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

Esse método oculta o cursor, perde o foco e, mais importante, define a cor do texto como preto, comportando-se como o TextView.

E para reverter Voltar para o editText, basta fazer isso para obter todas as propriedades do EditText.

editText.setEnabled(true);

Espero que ajude :)

Superusuário
fonte
3

Você poderia usar, android:editable="false"mas eu realmente o aconselharia a usar setEnabled(false), pois fornece uma pista visual para o usuário de que o controle não pode ser editado. A mesma sugestão visual é usada por todos os widgets desativados e a consistência é boa.

jclafuente
fonte
3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

O atributo "longClickable" desativa as ações de imprensa longa que fazem com que as opções "Colar" e ou "Selecionar tudo" sejam exibidas como uma dica de ferramenta.

Radhey
fonte
2

Eu tentei o seguinte:

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

mas o problema era que, se o texto de edição é o primeiro no formulário, ele recebe o foco e o código pickCode () que inicia uma nova atividade é chamado imediatamente. Então, modifiquei o código da seguinte maneira e parece funcionar muito bem (exceto que não posso definir o foco na edição do texto, mas não preciso):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Cumprimentos,

Comentários bem-vindos,

John Goche

johngoche9999
fonte
1
Parece funcionar bem, mas não é mais fácil usar o TextView que se parece com EditText (usando: style = "@ android: style / Widget.EditText")?
desenvolvedor android
2

Eu uso EditText.setFocusable(false)e defino true novamente se quiser editar.

nobjta_9x_tq
fonte
2

Tente o seguinte:

android:inputType="none"
Rutvik
fonte
2

Dessa forma, fiz o trabalho para mim, posso selecionar e copiar para a área de transferência, mas não consigo modificar ou colar.

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"
Leo
fonte
1

android: editable está obsoleto, então use inputType .

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />
M-Razavi
fonte
android: inputType = "none" é muito diferente do android: editável, tente você mesmo!
precisa saber é o seguinte
Se você pretende tornar seu EditText não editável, sugiro usar o widget TextView em vez do EditText, pois o uso de um EditText parece meio inútil nesse caso.
M-Razavi
Sua sugestão não se aplica a um EditText com uma PopupWindow; consulte esta imagem para entender melhor o problema. Neste exemplo, quero a aparência de um EditText, mas tenho que "bloqueá-lo" para permitir que o usuário altere o valor apenas pela janela pop-up. Verifique esta questão para ver mais motivação. É um problema que é em torno desde 2009.
Denys Vitali
1

Eu enfrentei o mesmo problema, mas após a observação, descobri que android:editable="false"só funciona quando inputtype ( android:inputType="ANY_VALUE") não é fornecido no texto de edição.

Remova inputType do EditText e use editable = false, está funcionando bem.

shubomb
fonte
0

Eu resolvo isso com uma caixa de diálogo.

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });
João Scheleder Neto
fonte
0

Resposta curta: usei android:focusable="false"e funcionou. A escuta de cliques também está funcionando agora.

Anbuselvan Rocky
fonte
-1

Experimentar

.setInputType(InputType.TYPE_NULL);
benmakp benmakn
fonte
-10

Experimente este código. Está funcionando no meu projeto, portanto, funcionará no seu projeto.

android:editable="false"
user2309848
fonte
2
Posso confirmar que isso não funciona e o que é mais usando o método depreciado não é recomendado.
Adorjan Princz
1
android: editable é realmente a melhor solução se você deseja que o campo seja clicável, mas não editável, ou seja, para abrir uma caixa de diálogo depois de clicar nele.
7285 Yar
não porque ele trabalha no seu projeto, será no nosso. Pensamento muito ruim.
11136 Neon Warge