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
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());
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.
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
.
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"
désactiver à partir de XML (une ligne):
Android:focusable="false"
réactiver depuis Java, si besoin est (également une ligne):
editText.setFocusableInTouchMode(true);
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.
Cette combinaison a fonctionné pour moi:
<EditText ... >
Android:longClickable="false"
Android:cursorVisible="false"
Android:focusableInTouchMode="false"
</EditText>
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);
si vous voulez cliquer dessus sans vouloir le modifier, essayez:
Android:focusable="false"
Il suffit d'utiliser Android:enabled="false"
. Cela donnera également une apparence à la EditText
, ce qui la rendra non modifiable.
<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);
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);
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.
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.
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>
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 :)
Essaye ça :
Android:inputType="none"
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.
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"
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
J'utilise EditText.setFocusable(false)
et redéfinis sur true si je souhaite modifier.
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" />
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.