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.