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

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

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.


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.


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"

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

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.


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>

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

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"

8

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


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

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

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.


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>

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.


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


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.


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


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.



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"

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

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.


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

            }
        });

0

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



-10

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

android:editable="false"

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