Disabilitazione di EditText in Android


195

Nella mia applicazione, ho un EditText che l'utente ha solo l'accesso in lettura e non l'accesso in scrittura.

Nel codice ho impostato android:enabled="false".

Sebbene lo sfondo di EditText sia diventato scuro, quando faccio clic su di esso si apre la tastiera e posso cambiare il testo.

Cosa devo impostare per disabilitare EditText?


2
È possibile preservare sia lo stile della vista sia il comportamento di scorrimento. Per disabilitare un EditTextpo 'mantenendo queste proprietà, basta usare UI.setReadOnly(myEditText, true)da questa libreria . Se vuoi replicare questo comportamento senza la libreria, controlla il codice sorgente per questo piccolo metodo.
Caw

Risposte:


245

Credo che sarebbe corretto impostare android:editable="false".

E se ti chiedi perché il mio link punta agli attributi di TextView, la risposta è perché EditTexteredita da TextView:

EditText è un'impiallacciatura sottile su TextView che si configura come modificabile.

Aggiornamento:
come menzionato nei commenti seguenti, editableè obsoleto ( dal livello API 3 ). Dovresti invece utilizzare inputType(con il valore none).


grazie Nailuj, purtroppo non ha funzionato. Dopo aver aggiunto il suggerimento, viene visualizzata la tastiera e c'è la possibilità di modificare il testo.
Hesam,

18
android: modificabile è deprecato. android: inputType = "none" dovrebbe essere usato invece ma contiene bug e non funziona. Sarebbe bello se tutti iniziassimo il problema qui: code.google.com/p/android/issues/detail?id=2854
Viktor Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asintoto

28
android:editable="false" android:focusable="false"funziona benissimo per me (dimentica di essere deprecato, penso Android: modificabile non ha nulla a che fare con Android: inputType)
Muhammad Babar

8
Per tutti quelli per cui android: inputType = "none" non funziona, prova: android: inputType = "none" con android: focusable = "false"
Surendra Kumar,

162

usare EditText.setFocusable(false) per disabilitare la modifica
EditText.setFocusableInTouchMode(true)per abilitare la modifica;


Funziona, ma non è una buona pratica perché la vista sembra modificabile ma non può. Ha funzionato bene per me perché la mia vista aveva uno sfondo personalizzato, quindi +1.
Kaneda,

4
@kaneda. In realtà preferisco questo. Non voglio che la mia scatola sia disattivata. :)
Doomsknight,

1
In Android 4.4, questa opzione mantiene il colore del testo originale. L'uso editText.setEnabled(false);cambierà il colore del testo in grigio. Tuttavia, i filatori non cambiano il colore del testo durante l'utilizzo setEnabled, rendendolo un'esperienza incoerente.
tbraun,

perchè no setFocusable(true)? vedi questo link per la differenza tra setFocusable()e setFocusableInTouchMode(): stackoverflow.com/questions/23799064/...
kenju

Questo si adatta davvero alle mie esigenze. Ho creato una vista personalizzata composta con un EditText all'interno. Sto riscontrando problemi nel rendere la mia visualizzazione personalizzata per accettare solo clic ma non modificabile in quanto ciò avvia una finestra di dialogo di selezione della data. Questa soluzione funziona in quanto non disabilita onClickListeners
Neon Warge

64

Puoi provare il seguente metodo:

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

EditText abilitato:

EditText abilitato

Modifica testo disabilitato:

Modifica testo disabilitato

Funziona per me e spero che ti aiuti.


1
Sembra un TextView. È così incredibile. Questo è quello che sto cercando.
Yunus,

4
Nel caso in cui qualcuno abbia lo stesso problema con l'abilitazione, devi chiamare editText.setFocusableInTouchMode(true)invece di editText.setFocusable(true).
Dart Dega

62

Usalo per disabilitare l'input dell'utente

android:focusable="false"

android: editable = "false" Questo metodo è deprecato.


1
Questa dovrebbe essere la risposta accettata. L'impostazione del tipo di input su "none" come suggerito nelle altre risposte non funziona (sempre). L'impostazione abilitata su "false" impedisce la modifica, ma attenua anche il testo che può o non può essere desiderato.
jerry,

36

Per disabilitare la modifica EditText, penso che possiamo usare focusable OR enable ma

  1. Utilizzando android:enabled=...oeditText.setEnabled(...)

    Cambia anche il colore del testo in EditTextgrigio.
    Quando si fa clic, non ha alcun effetto

  2. Utilizzando android:focusable=...o editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    Non cambia il colore del testo di EditText
    Quando viene selezionato, evidenzia la EditTextriga inferiore per circa alcuni millisecondi

Produzione

inserisci qui la descrizione dell'immagine


È possibile aggiungere android:longClickable="false"insieme android:focusable="false"per rimuovere l'evidenziazione temporanea quando si tocca questa vista. Ciò impedisce anche la comparsa del popup "seleziona tutto".
CzarMatt

19

Come android:editable="false"è deprecato. È possibile utilizzare InputType TYPE_NULL su EditText

usare così:

editText.setInputType(InputType.TYPE_NULL);

1
Mi è piaciuta questa risposta perché non disabilita onClickListener sul campo.
Harsh Ganatra,

cosa fare se inputType è password? TYPE_NULL rende visibile la password.
ilyamuromets

17

Come android:editable="false"deprecatoxml

Usa android:enabled="false"è semplice. Perché usare più codice?

Se lo desideri java class, puoi anche utilizzarlo a livello di codice

 editText.setEnabled(false);

usa android: enabled = "true" per abilitare
android_jain il

8

Semplicemente:

editText.setEnabled(false);

1
In cosa differisce dalla risposta precedente (quindi come domanda)?
Onik,

setFocusable (false) ti consente anche di impostare un OnClickListener.
Oded Breiner,

5

Imposta sotto le proprietà in classe:

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

Funzionerà senza problemi come richiesto.


solo enabledera sufficiente
ateebahmed

5

Per disabilitare la funzionalità di un EditText, basta usare:

EditText.setInputType(InputType.TYPE_NULL);

nel caso tu voglia abilitarlo in qualche modo, allora puoi usare:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

cosa fare se inputType è password? TYPE_NULL rende visibile la password.
ilyamuromets

4

se usi android:editable="false", eclipse ti ricorderà questo messaggio "android: modificabile è deprecato: usa invece inputType".

Quindi, io uso android:focusable="false"invece, ha funzionato bene per me.


4
android:editable="false"

è ora deprecato e utilizza

 YourEditText.setInputType(InputType.TYPE_NULL);

cosa fare se inputType è password? TYPE_NULL rende visibile la password.
ilyamuromets

@ilyamuromets Questa risposta potrebbe aiutare stackoverflow.com/a/16720520/7704650 con TYPE_TEXT_VARIATION_PASSWORDSegui questo per ulteriori informazioni developer.android.com/reference/android/text/InputType
emkarachchi

Voglio disabilitare l'inserimento in EditText mentre la tastiera virtuale è aperta e l'utente tenta di inserire testo. InputType.TYPE_NULL funziona alla grande con isFocusable e isFocusableInTouchMode in falso valore. Ma se inputType del campo di input è textPassword, InputType.TYPE_NULL rende visibile il valore della password. Se imposto InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD quindi anche la password diventa visibile e l'utente può inserire del testo.
ilyamuromets


3

Questo renderà il tuo edittext disabilitato .

editText.setEnabled(false);

E usando questo

editText.setInputType(InputType.TYPE_NULL);

Farà in modo che il tuo Edittext non mostri la tua tastiera, ma se è collegato a una tastiera fisica, ti permetterà di digitare.


cosa fare se inputType è password? TYPE_NULL rende visibile la password.
ilyamuromets

3

Disabilita = FOCUS + CLICCA + CURSORE

Disabilitare la messa a fuoco, il clic e la visibilità del cursore fa al caso mio.

Ecco il codice in 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

Uso google Material Design Library appena rilasciato. Nel mio caso, funziona quando utilizzo 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

Nel mio caso avevo bisogno che io EditTextscorressi il testo se no. di righe supera maxLinesquando è disabilitato. Questa implementazione ha funzionato perfettamente per me.

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

Prova questo, funziona bene per me:

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: è necessario aggiungere this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); sulla tua attività altrimenti keyboardverrà visualizzato popup per la prima volta.


1

Come alcune risposte lo menzionano, se disabiliti editText diventa grigio e se imposti il ​​focusable falso il cursore sta visualizzando.

Se vuoi farlo solo con XML, questo ha funzionato

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

Aggiungo semplicemente un FrameLayout che appare sopra il editText e lo metto a fuoco e cliccabile in modo che il editText non possa essere cliccato.


0

Questo funziona per me:

Android: = focusable "false"


2
In che modo è diverso da ciò che Sampath Kumar ha pubblicato 4 anni fa?
Gobrewers 14,

0

Dal commento di @Asymptote sulla risposta accettata, utilizzare:

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

... e Bob è tuo zio.


0

Oggi uso ancora editable="false", ma anche confocusable="false" .

Penso che il caso in cui dobbiamo rendere un EditText non modificabile, sia perché vogliamo mantenere il suo stile EditText (con tale sottolineatura, con suggerimenti, ecc.), Ma accetta altri input invece del testo. Ad esempio un elenco a discesa.

In tale caso di utilizzo, è necessario disporre del EditTextclic (quindi enabled="false"non è adatto). L'impostazione focusable="false"fa questo trucco, tuttavia, posso ancora tenere a lungo il EditText e incollare il mio testo dagli appunti . A seconda del codice e della gestione, questo può persino causare il crash dell'app.

Quindi ho anche usato editable="false"e ora tutto è fantastico, tranne l'avvertimento.


0

puoi usare android:focusable="false"ma devi anche disabilitare il cursore altrimenti la funzione copia / incolla funzionerebbe comunque.

quindi usa

android:focusable="false"
android:cursorVisible="false"

0

Ci sono molti modi per raggiungere livelli multipli di disabili.

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

impedisce la EditTextvisualizzazione della tastiera - la scrittura in alcuni testi. Ma il cursore è ancora visibile e l'utente può incollare del testo.

  • editText.setCursorVisible(false)

nasconde il cursore. Non sono sicuro del motivo per cui vorresti farlo. L'utente può inserire testo e incollare.

  • editText.setKeyListener(null)

Trovo questo il modo più conveniente. Non è possibile in che modo l'utente può inserire il testo, ma il widget funziona ancora OnClickListenerse si desidera attivare un'azione quando l'utente lo tocca

  • editText.setEnabled(false);

disabilita completamente EditText. È letteralmente "sola lettura", l'utente non può inserire alcun testo al suo interno e (ad esempio) OnClickListener no lavora.

TextEdit Documentazione di


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.