Désactivation de EditText dans Android


195

Dans mon application, j'ai un EditText que l'utilisateur n'a qu'un accès en lecture et non un accès en écriture.

Dans le code que je mets android:enabled="false".

Bien que l'arrière-plan de EditText soit devenu sombre, lorsque je clique dessus, le clavier apparaît et je peux changer le texte.

Que dois-je définir pour désactiver EditText?


2
Il est possible de conserver à la fois le style de la vue et le comportement de défilement. Pour désactiver un EditTexttout en gardant cette propriétés, il suffit d' utiliser UI.setReadOnly(myEditText, true)de cette bibliothèque . Si vous souhaitez répliquer ce comportement sans la bibliothèque, consultez le code source de cette petite méthode.
caw

Réponses:


245

Je crois que le correct serait de mettre android:editable="false" .

Et si vous vous demandez pourquoi mon lien pointe vers les attributs de TextView, vous la réponse est parce que EditTexthérite de TextView:

EditText est un placage fin sur TextView qui se configure pour être modifiable.

Mise à jour:
Comme mentionné dans les commentaires ci-dessous, editableest obsolète ( depuis le niveau 3 de l'API ). Vous devriez plutôt utiliser inputType(avec la valeur none).


merci Nailuj, malheureusement cela n'a pas fonctionné. Après avoir ajouté votre clavier de suggestion apparaît et il est possible de changer le texte.
Hesam

18
android: modifiable est déconseillé. android: inputType = "none" doit être utilisé à la place mais il contient un bug et cela ne fonctionne pas. Ce serait bien si nous publions
Viktor Brešan

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

28
android:editable="false" android:focusable="false"fonctionne très bien pour moi (oubliez obsolète, je pense que android: editable n'a rien à voir avec android: inputType)
Muhammad Babar

8
Pour tous ceux pour qui android: inputType = "none" ne fonctionne pas, essayez: android: inputType = "none" avec android: focusable = "false"
Surendra Kumar

161

utiliser EditText.setFocusable(false) pour désactiver l'édition
EditText.setFocusableInTouchMode(true)pour activer l'édition;


Cela fonctionne, mais ce n'est pas une bonne pratique car la vue semble être modifiable mais pas. Ça a bien fonctionné pour moi car ma vue avait un arrière-plan personnalisé, donc +1.
kaneda

4
@kaneda. En fait, je préfère ça. Je ne veux pas que ma boîte soit grisée. :)
Doomsknight

1
Dans Android 4.4, cette option conserve la couleur du texte d'origine. L'utilisation editText.setEnabled(false);changera la couleur du texte en gris. Cependant, les flèches ne modifient pas la couleur du texte lors de l'utilisation setEnabled, ce qui en fait une expérience incohérente.
tbraun

pourquoi pas setFocusable(true)? voir ce lien pour la différence entre setFocusable()et setFocusableInTouchMode(): stackoverflow.com/questions/23799064/…
kenju

Cela correspond vraiment à mes besoins. J'ai créé une vue personnalisée composée avec un EditText à l'intérieur. J'ai du mal à créer la vue personnalisée pour accepter uniquement les clics mais pas modifiable car cela ouvre une boîte de dialogue de sélection de date. Cette solution fonctionne car elle ne désactive pas onClickListeners
Neon Warge

64

Vous pouvez essayer la méthode suivante:

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

EditText activé:

EditText activé

EditText désactivé:

EditText désactivé

Cela fonctionne pour moi et j'espère que cela vous aide.


1
Cela ressemble à un TextView. C'est tellement incroyable. Voilà ce que je recherche.
Yunus le

4
Dans le cas où quelqu'un a le même problème avec la réactivation - vous devez appeler à la editText.setFocusableInTouchMode(true)place de editText.setFocusable(true).
Dart Dega

61

Utilisez-le pour désactiver la saisie utilisateur

android:focusable="false"

android: editable = "false" Cette méthode est obsolète.


1
Cela devrait être la réponse acceptée. La définition du type d'entrée sur «aucun» comme suggéré dans d'autres réponses ne fonctionne pas (toujours). Le réglage activé sur «faux» empêche la modification mais atténue également le texte qui peut être souhaité ou non.
jerry

36

Pour désactiver l'édition EditText, je pense que nous pouvons utiliser focusable OR enable mais

  1. En utilisant android:enabled=...oueditText.setEnabled(...)

    Il change également la couleur du texte en EditTextgris.
    Lorsque vous cliquez dessus, cela n'a aucun effet

  2. Utilisation de android:focusable=...oueditText.setFocusable(false) -editText.setFocusableInTouchMode(true)

    Il ne change pas la couleur du texte de EditText
    Lorsque cliqué, il met en évidence la EditTextligne du bas pendant environ quelques millisecondes

Production

entrez la description de l'image ici


19

Comme il android:editable="false"est déprécié. Vous pouvez utiliser InputType TYPE_NULL sur EditText

utiliser comme ceci:

editText.setInputType(InputType.TYPE_NULL);

1
J'ai aimé cette réponse car elle ne désactive pas le onClickListener sur le terrain.
Harsh Ganatra

que faire si le type d'entrée est un mot de passe? TYPE_NULL rend le mot de passe visible.
ilyamuromets

17

Comme android:editable="false"déconseillé dansxml

Utilisez android:enabled="false"c'est simple. Pourquoi utiliser plus de code?

Si vous le souhaitez, java classvous pouvez également l'utiliser par programmation

 editText.setEnabled(false);

utilisez android: enabled = "true" pour activer
android_jain

8

Simplement:

editText.setEnabled(false);

1
En quoi diffère-t-elle de la réponse précédente (comme la question)?
Onik

setFocusable (false) vous permet également de définir un OnClickListener.
Oded Breiner

5

Définissez les propriétés ci-dessous dans la classe:

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

Cela fonctionnera en douceur selon vos besoins.


seulement enabledétait suffisant
ateebahmed

5

Pour désactiver la fonctionnalité d'un EditText, utilisez simplement:

EditText.setInputType(InputType.TYPE_NULL);

au cas où vous voudriez l'activer d'une manière ou d'une autre, alors vous pouvez utiliser:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

que faire si le type d'entrée est un mot de passe? TYPE_NULL rend le mot de passe visible.
ilyamuromets

4

si vous utilisez android:editable="false", eclipse vous rappellera ce message "android: editable est déconseillé: utilisez plutôt inputType".

Donc, j'utilise à la android:focusable="false"place, cela a bien fonctionné pour moi.


4
android:editable="false"

est désormais obsolète et utilise

 YourEditText.setInputType(InputType.TYPE_NULL);

que faire si le type d'entrée est un mot de passe? TYPE_NULL rend le mot de passe visible.
ilyamuromets

@ilyamuromets Cette réponse pourrait aider stackoverflow.com/a/16720520/7704650 avec TYPE_TEXT_VARIATION_PASSWORDSuivez ceci pour plus developer.android.com/reference/android/text/InputType
emkarachchi

Je souhaite désactiver la saisie dans EditText lorsque le clavier virtuel est ouvert et que l'utilisateur essaie de saisir du texte. InputType.TYPE_NULL fonctionne très bien avec isFocusable et isFocusableInTouchMode en valeur fausse. Mais si inputType du champ de saisie est textPassword, InputType.TYPE_NULL rend la valeur du mot de passe visible. Si je mets InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD puis le mot de passe devient également visible et l'utilisateur peut saisir du texte.
ilyamuromets


3

Désactiver = FOCUS + CLICK + CURSOR

Désactiver la mise au point, le clic et la visibilité du curseur me suffit.

Voici le code en 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

Cela rendra votre edittext désactivé .

editText.setEnabled(false);

Et en utilisant cela

editText.setInputType(InputType.TYPE_NULL);

Ne fera que votre Edittext n'affichera pas votre clavier logiciel, mais s'il est connecté à un clavier physique, il vous permettra de taper.


que faire si le type d'entrée est un mot de passe? TYPE_NULL rend le mot de passe visible.
ilyamuromets

2

J'utilise la nouvelle bibliothèque de conception de matériaux de google. Dans mon cas, cela fonctionne lorsque j'utilise android: focusable = "false" et 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

Dans mon cas, j'avais besoin de mon EditTextpour faire défiler le texte si non. de lignes dépassent maxLineslorsque son désactivé. Cette implémentation a parfaitement fonctionné pour moi.

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

Essayez celui-ci, fonctionne très bien pour moi:

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

Remarque: vous devez ajouter this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); votre activité, sinon une fenêtre contextuellekeyboard apparaîtra la première fois.


1

Comme certains l'ont mentionné, si vous désactivez le editText, il devient gris et si vous définissez false sur le focus, le curseur s'affiche.

Si vous souhaitez le faire uniquement avec xml, cela a fait l'affaire

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

J'ajoute simplement un FrameLayout apparaissant au-dessus du editText et je le place focalisable et cliquable pour que le editText ne puisse pas être cliqué.


0

Cela fonctionne pour moi:

android: focusable = "false"


2
En quoi est-ce différent de ce que Sampath Kumar a publié il y a 4 ans?
gobrewers14

0

Dans le commentaire de @ Asymptote sur la réponse acceptée, utilisez:

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

... et Bob est ton oncle.


0

Aujourd'hui j'utilise toujours editable="false", mais aussi avec focusable="false".

Je pense que le cas dont nous avons besoin pour rendre un EditText non modifiable, c'est parce que nous voulons garder son style EditText (avec ce soulignement, avec un indice, etc.), mais il accepte d'autres entrées au lieu du texte. Par exemple une liste déroulante.

Dans un tel cas d'utilisation, nous devons avoir le EditTextcliquable ( enabled="false"ne convient donc pas). Le réglage focusable="false"fait cette astuce, cependant, je peux encore tenir longtemps sur EditText et coller mon propre texte dessus depuis le presse-papiers . En fonction de votre code et de sa gestion, cela peut même bloquer votre application.

J'ai donc aussi utilisé editable="false"et maintenant tout est super, sauf l'avertissement.


0

vous pouvez utiliser android:focusable="false"mais vous devez également désactiver le curseur, sinon la fonction copier / coller fonctionnerait toujours.

alors, utilisez

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

0

Il existe plusieurs façons d'atteindre plusieurs niveaux de personnes handicapées.

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

empêche l' EditTextaffichage du clavier - écriture dans du texte. Mais le curseur est toujours visible et l'utilisateur peut coller du texte.

  • editText.setCursorVisible(false)

masque le curseur. Je ne sais pas pourquoi voudriez-vous faire ça. L'utilisateur peut saisir du texte et coller.

  • editText.setKeyListener(null)

Je trouve cela plus pratique. Il n'y a aucun moyen pour l'utilisateur de saisir du texte, mais le widget fonctionne toujours OnClickListenersi vous souhaitez déclencher une action lorsque l'utilisateur le touche

  • editText.setEnabled(false);

désactive complètement EditText. Il est littéralement en «lecture seule», l'utilisateur ne peut pas y saisir de texte et (par exemple) OnClickListener ne fonctionne pas avec.

Documentation TextEdit


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.