Desativando o EditText no Android

195

No meu aplicativo, tenho um EditText em que o usuário tem acesso de leitura e não de gravação.

No código que eu defini android:enabled="false".

Embora o fundo do EditText tenha mudado para escuro, quando clico nele, o teclado aparece e posso alterar o texto.

O que devo definir para desativar o EditText?

Hesam
fonte
2
É possível preservar o estilo da exibição e o comportamento de rolagem. Para desativar um EditText, mantendo esta propriedades, basta usar UI.setReadOnly(myEditText, true)a partir desta biblioteca . Se você deseja replicar esse comportamento sem a biblioteca, verifique o código-fonte desse pequeno método.
03

Respostas:

245

Eu acredito que o correto seria definir android:editable="false".

E se você se pergunta por que meu link aponta para os atributos de TextView, você a resposta é porque EditTextherda de TextView:

EditText é uma camada fina sobre o TextView que se configura para ser editável.

Atualização:
conforme mencionado nos comentários abaixo, editablefoi preterido ( desde o nível 3 da API ). Você deveria estar usando inputType(com o valor none).

Julian
fonte
obrigado Nailuj, infelizmente não funcionou. Depois de adicionar sua sugestão, o teclado aparece e é possível alterar o texto.
Hesam #
17
android: editável está obsoleto. android: inputType = "none" deve ser usado, mas contém um bug e não funciona. Seria bom se todos nós abordássemos a questão aqui: code.google.com/p/android/issues/detail?id=2854
Viktor Brešan 03/03
85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
9990
28
android:editable="false" android:focusable="false"funciona muito bem para mim (Forget About obsoleta, eu acho que o Android: editável não tem nada a ver com android: inputType)
Muhammad Babar
8
Para todos aqueles para quem o android: inputType = "none" não está funcionando, tente: android: inputType = "none" com o android: focusable = "false"
Surendra Kumar
161

use EditText.setFocusable(false) para desativar a edição
EditText.setFocusableInTouchMode(true)para ativar a edição;

Sean Android
fonte
Funciona, mas não é uma boa prática, porque a exibição parece que pode ser editável, mas não pode. Funcionou bem para mim porque meu modo de exibição tinha um plano de fundo personalizado; portanto, +1.
Kaneda
4
@kaneda. Na verdade, eu prefiro isso. Não quero minha caixa acinzentada. :)
Doomsknight
1
No Android 4.4, essas opções mantêm a cor do texto original. O uso editText.setEnabled(false);mudará a cor do texto para cinza. No entanto, os giradores não alteram a cor do texto ao usá- setEnabledlo, tornando-o uma experiência inconsistente.
tbraun 30/09/14
por que não setFocusable(true)? veja este link para a diferença entre setFocusable()e setFocusableInTouchMode(): stackoverflow.com/questions/23799064/...
Kenju
Isso realmente se encaixa nas minhas necessidades. Eu criei uma exibição personalizada composta com um EditText dentro. Estou tendo problemas para tornar a minha visualização personalizada apenas para aceitar cliques, mas não editável, pois isso abre uma caixa de diálogo do seletor de datas. Esta solução funciona, pois não desativa onClickListeners
Neon Warge
64

Você pode tentar o seguinte método:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

EditText ativado:

Ativado EditText

EditText desativado:

Desativado EditText

Funciona para mim e espero que ajude você.

Maksym Kalin
fonte
1
Parece um TextView. Isso é tão incrível. É isso que estou procurando.
Yunus
4
Caso alguém tenha o mesmo problema com a ativação de retorno - você deve ligar em editText.setFocusableInTouchMode(true)vez de editText.setFocusable(true).
Dart Dega
61

Use isso para desativar a entrada do usuário

android:focusable="false"

android: editable = "false" Este método está obsoleto.

Sampath Kumar
fonte
1
Essa deve ser a resposta aceita. Definir o tipo de entrada como 'none' como sugerido em outras respostas (sempre) não funciona. A configuração ativada como 'false' impede a edição, mas também escurece o texto que pode ou não ser desejado.
Jerry
36

Para desativar a edição EditText, acho que podemos usar focusable OR, enable mas

  1. Usando android:enabled=...oueditText.setEnabled(...)

    Também altera a cor do texto EditTextpara cinza.
    Quando clicado, não tem efeito

  2. Usando android:focusable=...ou editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    Não muda a cor do texto. EditText
    Quando clicado, destaca a EditTextlinha inferior por alguns milissegundos

Resultado

insira a descrição da imagem aqui

Phan Van Linh
fonte
19

Como android:editable="false"é privado. Você pode usar InputType TYPE_NULL em EditText

use assim:

editText.setInputType(InputType.TYPE_NULL);
Bhargav Thanki
fonte
1
Gostei desta resposta porque não desativa o onClickListener no campo.
Harsh Ganatra 29/03
o que fazer se o inputType for senha? TYPE_NULL torna a senha visível.
ilyamuromets
17

Como android:editable="false"reprovado emxml

Use android:enabled="false"é simples. Por que usar mais código?

Se você quiser, java classtambém pode usar isso programaticamente

 editText.setEnabled(false);
android_jain
fonte
use android: enabled = "true" para ativar
android_jain 2/18/18
8

Simplesmente:

editText.setEnabled(false);
Oded Breiner
fonte
1
Como isso difere da resposta anterior (como na pergunta)?
Onik 07/11
setFocusable (false) também permite definir um OnClickListener.
Oded Breiner
5

Defina as propriedades abaixo na classe:

editText.setFocusable(false);
editText.setEnabled(false);

Funcionará sem problemas conforme necessário.

Classificação
fonte
única enabledera suficiente
ateebahmed
5

Para desativar a funcionalidade de um EditText, basta usar:

EditText.setInputType(InputType.TYPE_NULL);

caso deseje ativá-lo de alguma forma, você pode usar:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);
hypergogeta
fonte
o que fazer se o inputType for senha? TYPE_NULL torna a senha visível.
ilyamuromets
4

se você usar android:editable="false", o eclipse lembrará esta mensagem "android: editável está obsoleta: use inputType".

Então, eu uso em android:focusable="false"vez disso, funcionou bem para mim.

wangzhengyi
fonte
4
android:editable="false"

agora está obsoleto e usa

 YourEditText.setInputType(InputType.TYPE_NULL);
emkarachchi
fonte
o que fazer se o inputType for senha? TYPE_NULL torna a senha visível.
ilyamuromets
@ilyamuromets Esta resposta pode ajudar a stackoverflow.com/a/16720520/7704650 em TYPE_TEXT_VARIATION_PASSWORDSiga-o para obter mais developer.android.com/reference/android/text/InputType
emkarachchi em
Eu quero desativar a entrada no EditText enquanto o teclado virtual estiver aberto e o usuário tentando inserir texto. InputType.TYPE_NULL funciona muito bem com isFocusable e isFocusableInTouchMode em valor falso. Mas se inputType do campo de entrada for textPassword, então InputType.TYPE_NULL tornará o valor da senha visível. Se eu definir InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD, a senha também se torna visível e o usuário pode inserir texto.
ilyamuromets
3

Use em TextViewvez disso.

cx0der
fonte
3

Desativar = FOCO + CLIQUE + CURSOR

Desativar o foco, clicar e visibilidade do cursor faz o truque para mim.

Aqui está o código em XML

<EditText
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:cursorVisible="false"
    android:clickable="false"
    />
Rohit Singh
fonte
2

Isso tornará seu edittext desativado .

editText.setEnabled(false);

E usando isso

editText.setInputType(InputType.TYPE_NULL);

Apenas fará com que o seu Texto de edição não mostre sua softkey, mas se estiver conectado a um teclado físico, permitirá que você digite.

Mark Joshua Fajardo
fonte
o que fazer se o inputType for senha? TYPE_NULL torna a senha visível.
ilyamuromets
2

Eu uso o Google recém-lançado Material Design Library. No meu caso, ele funciona quando eu uso android: focusable = "false" e android: cursorVisible = "false"

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>
Aminul Haque Aome
fonte
1

No meu caso, eu precisava EditTextque rolasse o texto, se não. de linhas excede maxLinesquando está desativado. Essa implementação funcionou perfeitamente para mim.

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}
Rishabh876
fonte
1

Experimente este, funciona bem para mim:

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

Nota: Você precisa adicionar this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); em sua atividade ou então keyboardirá aparecer na primeira vez.

Favas Kv
fonte
1

Como algumas respostas mencionam, se você desativar o editText, ele ficará cinza e se você definir o foco como falso, o cursor será exibido.

Se você gostaria de fazê-lo apenas com xml, isso fez o truque

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

Simplesmente adiciono um FrameLayout que aparece acima do editText e o defina como focalizável e clicável para que o editText não possa ser clicado.

Vodet
fonte
0

Isso funciona para mim:

android: focusable = "false"

Annie
fonte
2
Como isso é diferente do que Sampath Kumar postou 4 anos atrás?
precisa saber é o seguinte
0

No comentário de @ Asymptote sobre a resposta aceita, use:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... e Bob é seu tio.

Tom Howard
fonte
0

Hoje eu ainda uso editable="false", mas também com focusable="false".

Eu acho que o caso em que precisamos tornar um EditText não editável é porque queremos manter seu estilo EditText (com esse sublinhado, com dica, etc), mas ele aceita outras entradas em vez de texto. Por exemplo, uma lista suspensa.

Nesse caso de uso, precisamos ter o EditTextclicável (portanto, enabled="false"não é adequado). Definindo focusable="false"esse truque, no entanto, ainda posso segurar o EditText por muito tempo e colar meu próprio texto nele da área de transferência . Dependendo do seu código e manuseio, isso pode até travar seu aplicativo.

Então eu também usei editable="false"e agora está tudo ótimo, exceto o aviso.

Sira Lam
fonte
0

você pode usar, android:focusable="false"mas também precisa desativar o cursor, caso contrário, a função copiar / colar ainda funcionará.

então use

android:focusable="false"
android:cursorVisible="false"
M.Usman
fonte
0

Existem vários foi como alcançar vários níveis de pessoas com deficiência.

  • editText.setShowSoftInputOnFocus(false); e editText.setFocusable

impede que o EditTextteclado seja exibido em algum texto. Mas o cursor ainda está visível e o usuário pode colar em algum texto.

  • editText.setCursorVisible(false)

oculta o cursor. Não sei por que você gostaria de fazer isso. O usuário pode inserir texto e colar.

  • editText.setKeyListener(null)

Acho esse caminho mais conveniente. Não há como o usuário pode inserir texto, mas o widget ainda funciona OnClickListenerse você deseja desencadear uma ação quando o usuário toca nele.

  • editText.setEnabled(false);

desativa completamente EditText. É literalmente 'somente leitura', o usuário não pode inserir nenhum texto e (por exemplo) OnClickListener não trabalha com ele.

Documentação do TextEdit

Azul profundo
fonte
0

Defina isso no seu código XML, ele funciona.

android: focusableInTouchMode = "false"

Sujeet Kumar Gupta
fonte