Comment rendre EditText non modifiable via XML dans Android?

300

Quelqu'un peut-il me dire comment rendre un EditTextfichier non modifiable via XML? Je mise essayé android:editablede false, mais

  1. il est obsolète; et
  2. ça n'a pas marché.
Fran Fitzpatrick
la source
6
S'il n'est pas modifiable, pourquoi auriez-vous besoin de l'EditText? Vous n'utilisez pas un TextView ordinaire? Et la fonction setEditable () est-elle également obsolète?
kiki
4
Pour moi, cela a du sens afin d'activer le copier-coller standard pour le contenu. Avec un TextView ce n'est pas possible (du moins pas le comportement par défaut)
Ixx
1
Correction: c'est une mauvaise idée. Dans certaines circonstances, la vue devient modifiable ou les options de copier-coller ne s'affichent plus. Cherchera une autre approche.
Ixx
11
Dans mon cas, je souhaite désactiver temporairement un EditText pendant l'exécution d'un ensemble d'opérations, puis le réactiver à la fin de l'opération.
Joe Plante
1
Cette question concerne une préoccupation légitime. Pour conserver le EditTextstyle et permettre le défilement, utilisez à UI.setReadOnly(myEditText, true)partir de cette bibliothèque . Il y a quelques propriétés qui doivent être définies, que vous pouvez vérifier dans le code source .
caw

Réponses:

399

Utilisez ce code simple:

textView.setKeyListener(null);

Ça marche.

Modifier: pour ajouter KeyListenerplus tard, procédez comme suit

1: définissez l'écouteur de clé sur la balise textView

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

2: récupérez l'écouteur de clé dans la balise et remettez-le à textView

textView.setKeyListener((KeyListener) textView.getTag());
Kristiono Setyadi
la source
30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); définissez-le plus tard avec textView.setKeyListener ((KeyListener) textView.getTag ());
Thomas Dignan
@TomDignan excellent moyen facilement pour cela! J'ai une question. Cela modifie-t-il de quelque manière que ce soit les valeurs par défaut nécessaires à KeyListener, comme setFocusable()parce que le document indique que l'implémentation par défaut pourrait être modifiée si elle était modifiée.
Andy
afaik non, la balise devrait être disponible pour que vous puissiez l'utiliser
Thomas Dignan
Hé votre suggestion m'a aidé .. merci
user1387035
38
La question était de le configurer via XML , pourquoi est-ce marqué comme solution?
Denys Vitali
398

Ajoutez ceci à votre fichier xml EditText:

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

Cela fera le même effet que android:editable="false". A fonctionné pour moi, j'espère que cela fonctionnera aussi pour vous.

GalDude33
la source
3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
Jack Franzen
3
Si vous voulez le faire dans le XML ... quelle sera la différence entre lui et TextView ???
Chris Sim
11
La différence est qu'il peut être utilisé avecTextInputLayout
ahmadalibaloch
2
Cela devrait être marqué comme la solution, car il s'agit d'une solution XML pure comme demandé dans la question.
zgc7009
2
Ceci est obsolète (octobre 2018)
Sebastian Paduano
54

Laissez votre Edittext être

EditText editText;

editText.setKeyListener(null);

fonctionnera mais il ne suffit pas d'écouter les touches.

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

Tu peux essayer editText.setEnabled(false);

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

Mahendran
la source
3
C'est correct car EditText est une sous-classe de TextView. Cependant, veuillez utiliser editText comme variable au lieu de textView.
Joe Plante
@JoePlante Changement du nom de variable merci pour le commentaire constructif.
Mahendran
cela grise le EditText
stephen
GrayTed EditText indique que son est désactivé et que l'utilisateur ne peut pas le modifier.
Mahendran
Le réglage de la couleur ainsi que permettra d'éviter l'apparence grisée. XML: Essayez android: textColor = "@ color / Black" android: enabled = "false"
Vin rouge
32

Comme mentionné dans d'autres réponses, vous pouvez le faire, setEnabled(false) mais puisque vous demandez comment le définir via XML, voici comment le faire.

Ajoutez l'attribut suivant à votre EditText:

android:enabled="false"
vida
la source
4
réponse exacte à la question des PO.
SMR
mais cette méthode est déconseillée
Lalit kumar
2
@Lalitkumar enabledn'est pas déconseillé. editableest.
InsanityOnABun
7
par activer, nous ne pouvons pas accéder à l'écouteur de clic également. donc pour moi ce n'est pas la réponse.
Naveed Ahmad
c'est masquer le texte :(
Chego
24

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

 android:focusable="false"

réactiver à partir de Java, le cas échéant (également une ligne):

editText.setFocusableInTouchMode(true);
kouretinho
la source
Bonne réponse. De cette façon, vous pouvez toujours définir la valeur editText en utilisant editText.setText ("votre texte"). Mais l'utilisateur ne peut pas le modifier.
Prakash
17

Ils ont rendu obsolète "modifiable" mais n'ont pas fourni un correspondant correspondant dans inputType.

Soit dit en passant, inputType = "none" a-t-il un effet? L'utiliser ou non ne fait aucune différence pour moi.

Par exemple, le editText par défaut serait une seule ligne. Mais vous devez sélectionner un InputType pour qu'il soit sur une seule ligne. Et si vous sélectionnez "aucun", c'est toujours multiligne.

Timuçin
la source
1
Cela ne fait aucune différence sur tous les appareils, mais cela devrait , selon les documents: developer.android.com/reference/android/widget/…
caw
12
Un bel exemple de désordre Google
Yar
14

Cette combinaison a fonctionné pour moi:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>
Massimo Fazzolari
la source
13

Comme vous l'avez mentionné Android: modifiable est obsolète. android: inputType = "none" doit être utilisé à la place mais cela ne fonctionne pas en raison 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>

Du code:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);
Adorjan Princz
la source
Avec l'aimable autorisation de google, le bug tombera dans deux scénarios différents: 1.) Il sera corrigé mais après 6 ans 2.) Il ne sera jamais corrigé, ils développeront simplement une nouvelle version d'Android.
Neon Warge
12

si vous voulez cliquer dessus mais ne voulez pas le modifier, essayez:

        android:focusable="false"
Kai Wang
la source
8

Utilisez simplement android:enabled="false". Cela donnera également une apparence à ce EditTextqui le rendra non modifiable.

Shahid Sarwar
la source
7
<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 utilisez ce qui suit:

txtDate.setKeyListener(null);
askimp
la source
7

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

editText.setEnabled(false);

Et cela pour lui permettre:

editText.setEnabled(true);
user3185897
la source
5

J'ai essayé de faire:

textView.setInputType( InputType.TYPE_NULL );

qui devrait fonctionner, mais pour moi cela n'a pas fonctionné.

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.

saric
la source
4

Lorsque je veux qu'une activité ne se concentre pas sur EditText et ne montre pas non plus 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>
Woppi
la source
4
android:focusable="false"

android:clickable="false"

android:longClickable="false"

L'attribut "longClickable" désactive les actions de pression longue qui font apparaître les options "Coller" et / ou "Sélectionner tout" sous forme d'infobulle.

Radhey
la source
3

En plus de @mahe madi, vous pouvez également essayer

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

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

Et pour revenir à editText, faites simplement ceci pour obtenir toutes les propriétés de EditText.

editText.setEnabled(true);

J'espère que ça aide :)

Superutilisateur
la source
3

Vous pouvez utiliser android:editable="false"mais je vous conseille vraiment de l'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.

jclafuente
la source
2

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 d'édition est le premier du formulaire, il obtient le focus et le code pickCode () qui lance une nouvelle activité est appelé immédiatement. J'ai donc modifié le code comme suit et il semble fonctionner assez bien (sauf que je ne peux pas mettre l'accent 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

johngoche9999
la source
1
Semble fonctionner correctement, mais n'est-il pas plus facile d'utiliser TextView qui ressemble à EditText (en utilisant: style = "@ android: style / Widget.EditText")?
développeur Android
2

J'utilise EditText.setFocusable(false)et redéfinis true si je veux éditer.

nobjta_9x_tq
la source
2

Essaye ça :

android:inputType="none"
Rutvik
la source
2

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

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"
Leo
la source
1

android: editable est déconseillé, utilisez plutôt inputType à la place.

   <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" />
M-Razavi
la source
android: inputType = "none" est très différent d'Android: modifiable, essayez-le vous-même!
Denys Vitali
Si vous allez rendre votre EditText non modifiable, puis-je suggérer d'utiliser le widget TextView au lieu de EditText, car l'utilisation d'un EditText semble un peu inutile dans ce cas.
M-Razavi
Votre suggestion ne s'applique pas pour un EditText avec un PopupWindow, voir cette image pour mieux comprendre le problème. Dans cet exemple, je veux l'apparence d'un EditText mais je dois le "verrouiller" afin de permettre à l'utilisateur de modifier la valeur juste par la fenêtre contextuelle. Vérifiez ce problème pour voir plus de motivation. C'est un problème qui existe depuis 2009.
Denys Vitali
1

J'ai rencontré le même problème mais après observation, j'ai constaté que cela android:editable="false"ne fonctionne que lorsque inputtype ( android:inputType="ANY_VALUE") n'est pas donné dans l'Edittext.

Supprimez inputType de EditText et utilisez editable = false, cela fonctionne bien.

shubomb
la source
0

Je résous cela avec une boîte de dialogue.

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });
João Scheleder Neto
la source
0

Réponse courte: j'ai utilisé android:focusable="false"et cela a fonctionné. L'écoute des clics fonctionne également maintenant.

Anbuselvan Rocky
la source
-1

Essayer

.setInputType(InputType.TYPE_NULL);
benmakp benmakn
la source
-10

Essayez ce code. Cela fonctionne dans mon projet, donc cela fonctionnera dans votre projet.

android:editable="false"
user2309848
la source
2
Je peux confirmer que cela ne fonctionne pas et de plus, l'utilisation d'une méthode dépréciée n'est pas recommandée.
Adorjan Princz
1
android: editable est en fait la meilleure solution si vous voulez que le champ soit cliquable mais non éditable, c'est-à-dire pour ouvrir une boîte de dialogue après avoir cliqué dessus.
Yar
pas parce que ça marche sur votre projet ça va sur le nôtre. Très mauvaise pensée.
Neon Warge