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?


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


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;


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ê.


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.


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



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

use android: enabled = "true" para ativar
android_jain 2/18/18

8

Simplesmente:

editText.setEnabled(false);

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.


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

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.


4
android:editable="false"

agora está obsoleto e usa

 YourEditText.setInputType(InputType.TYPE_NULL);

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

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

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.


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>

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

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.


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.



0

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

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

... e Bob é seu tio.


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.


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"

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


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.