web-dev-qa-db-fra.com

Comment rendre EditText non éditable par XML sous Android?

Quelqu'un peut-il me dire comment rendre une EditText non éditable via XML? J'ai essayé de régler Android:editable sur false, mais

  1. il est déconseillé et
  2. ça n'a pas marché.
288
Fran Fitzpatrick

Utilisez ce code simple:

textView.setKeyListener(null);

Ça marche.

Edit: Pour ajouter KeyListener plus tard, procédez comme suit

1: attribue à l'écouteur de touche la balise de textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2: récupère le programme d'écoute de la balise et le redéfinit sur textView

textView.setKeyListener((KeyListener) textView.getTag());
391

Ajoutez ceci à votre fichier XML EditText:

<EditText ...
        Android:clickable="false" 
        Android:cursorVisible="false" 
        Android:focusable="false" 
        Android:focusableInTouchMode="false">
</EditText>

Cela aura le même effet que Android:editable="false". Travaillé pour moi, espérons que cela fonctionnera pour vous aussi.

382
GalDude33

Laissez votre Edittext être

EditText editText;

editText.setKeyListener(null);

fonctionnera mais cela ne veut tout simplement pas écouter les touches.

L'utilisateur peut voir un curseur sur l'edittext.

Vous pouvez essayer editText.setEnabled(false);

Cela signifie que l'utilisateur ne peut pas voir le curseur. Dire simplement que cela deviendra TextView.

54
mahe madhi

Comme mentionné dans d'autres réponses, vous pouvez effectuer une setEnabled(false), mais puisque vous demandez comment la définir via XML, voici comment procéder.

Ajoutez l’attribut suivant à votre EditText:

Android:enabled="false"
28
vida

désactiver à partir de XML (une ligne):

 Android:focusable="false"

réactiver depuis Java, si besoin est (également une ligne):

editText.setFocusableInTouchMode(true);
24
kouretinho

Ils ont rendu "editable" obsolète, mais n’en ont pas fourni de correspondant correspondant dans inputType.

À propos, inputType = "none" n'a-t-il aucun effet? L’utiliser ou pas ne fait aucune différence pour moi.

Par exemple, le editText par défaut est dit à ligne unique. Mais vous devez sélectionner un type d’entrée pour qu’il s’agisse d’une ligne unique. Et si vous sélectionnez "aucun", il est toujours multiligne.

15
Timuçin

Cette combinaison a fonctionné pour moi:

<EditText ... >
    Android:longClickable="false"
    Android:cursorVisible="false"
    Android:focusableInTouchMode="false"
</EditText>
13
Massimo Fazzolari

Comme vous l'avez mentionné Android: editable est obsolète. Android: inputType = "none" devrait être utilisé à la place mais cela ne fonctionne pas à cause d'un bogue ( https://code.google.com/p/Android/issues/detail?id=2854 )

Mais vous pouvez réaliser la même chose en utilisant focusable.

Via XML:

<EditText ...
        Android:focusable="false" 
</EditText>

À partir du code:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);
13
Adorjan Princz

si vous voulez cliquer dessus sans vouloir le modifier, essayez:

        Android:focusable="false"
12
Kai Wang

Il suffit d'utiliser Android:enabled="false". Cela donnera également une apparence à la EditText, ce qui la rendra non modifiable.

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

et utiliser ce qui suit:

txtDate.setKeyListener(null);
7
askimp

Si vous voulez le faire dans le code Java, utilisez simplement cette ligne pour le désactiver:

editText.setEnabled(false);

Et ceci pour l'activer:

editText.setEnabled(true);
6
user3185897

J'ai essayé de faire:

textView.setInputType( InputType.TYPE_NULL );

ce qui devrait fonctionner, mais pour moi il n'a pas.

J'ai fini avec ce code:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

qui fonctionne parfaitement.

5
saric

Vous pouvez utiliser Android:editable="false" mais je vous conseillerais vraiment d'utiliser setEnabled(false), car il fournit un indice visuel à l'utilisateur que le contrôle ne peut pas être modifié. Le même repère visuel est utilisé par tous les widgets désactivés et la cohérence est bonne.

3
jclafuente

Lorsque je souhaite qu'une activité ne se concentre pas sur EditText et ne montre pas le clavier lorsque vous cliquez dessus, c'est ce qui a fonctionné pour moi.

Ajout d'attributs à la disposition principale

Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"

puis le champ EditText

Android:focusable="false"
Android:focusableInTouchMode="false"

Voici un exemple:

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

En plus de @mahe madi, vous pouvez aussi essayer ceci

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

Cette méthode masque le curseur, perd le focus et, plus important encore, définit la couleur du texte sur noir se comportant comme TextView.

Et pour revenir à editText, il vous suffit de le faire pour obtenir toutes les propriétés de EditText.

editText.setEnabled(true);

J'espère que ça aide :)

3
Superuser

Essaye ça :

Android:inputType="none"
2
Rutvik
Android:focusable="false"

Android:clickable="false"

Android:longClickable="false"

L'attribut "longClickable" désactive les actions longues qui entraînent l'affichage des options "Coller" et "Sélectionner tout" sous forme d'infobulle.

2
Radhey

De cette façon, le travail a été fait pour moi. Je peux sélectionner et copier dans le presse-papier, mais je ne peux ni le modifier ni le coller.

Android:enable="true"
Android:textIsSelectable="true"
Android:inputType="none"
2
Leo

J'ai essayé ce qui suit:

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

  }

});

mais le problème était que si le texte modifié est le premier du formulaire, il obtient le focus et le code pickCode () qui lance une nouvelle activité est immédiatement appelé. J'ai donc modifié le code comme suit et il semble fonctionner assez bien (sauf que je ne peux pas mettre le focus sur l'édition de texte mais je n'ai pas besoin de le faire):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Meilleures salutations,

Commentaires bienvenus,

John Goche

2
johngoche9999

J'utilise EditText.setFocusable(false) et redéfinis sur true si je souhaite modifier.

2
nobjta_9x_tq

Android: éditable est obsolète, utilisez plutôt 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" />
1
M-Razavi

J'ai rencontré le même problème, mais après observation, j'ai constaté que Android:editable="false" ne fonctionne que lorsque le type d'entrée (Android:inputType="ANY_VALUE") est non indiqué dans Edittext.

Supprimez inputType de EditText et utilisez editable = false, qui fonctionne correctement.

1
shubomb