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.

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());

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.


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.


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"

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);

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.


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>

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);

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"

8

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


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);

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);

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


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>

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 :)


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.


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.


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


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.



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"

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" />

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.


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();

            }
        });

0

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



-10

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

android:editable="false"

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.