web-dev-qa-db-fra.com

Comment répliquer Android: editable = "false" en code?

Dans la présentation, vous pouvez définir le widget EditText pour qu'il ne soit pas éditable via le Android:editable attribute.

Comment puis-je faire cela dans le code? Je dois rendre le widget EditText modifiable en fonction des conditions.

42
AngryHacker

Je pense qu'une InputFilter qui refuse tous les changements est une bonne solution:

editText.setFilters(new InputFilter[] {
    new InputFilter() {
        public CharSequence filter(CharSequence src, int start,
            int end, Spanned dst, int dstart, int dend) {
            return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
        }
    }
});

Edit: dlazar a suggéré (ci-dessous) de changer la return en dst.subSequence(dstart, dend) pour surmonter le comportement qui supprime les mots.

12
Josef Pfleger
editText.setFocusable(false);
editText.setClickable(false);

cela garantit que le contrôle EditText ne peut pas être sélectionné et concentré, donc il ne peut pas être édité.

39
Gerry

J'ai juste essayé moi-même,

Pour désactiver le texte d'édition:

.setFocusable(false);

cela définit également setFocusableInTouchMode sur false!

Pour activer le texte d'édition:

setFocusableInTouchMode(true);

cela définit également setFocusable sur true;

27
atpanos

La meilleure façon de procéder consiste à utiliser cette seule ligne de code:

textView.setKeyListener(null);

Les docs disent pour cette méthode:

Définit le programme d'écoute de clé à utiliser avec cette TextView. Cela peut être null à interdire la saisie de l'utilisateur.

15
Christopher Perry
Android:editable="false" 
Android:inputType="none" 

dans votre xml ou

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);

ou 

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
6
abhi

Vous pouvez essayer ceci:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

Ceci désactivera complètement EditText, désactivez un appui long si vous ne voulez pas que l'utilisateur ouvre les options de modification de texte. 

5
Babasaheb

Avez-vous essayé setText (Java.lang.CharSequence, Android.widget.TextView.BufferType) ? Il est décrit comme suit:

Définit le texte que cette TextView doit afficher (voir setText (CharSequence)) et détermine également si elle est stockée dans un tampon pouvant être stylé/pouvant être annoncé et si elle est modifiable.

(c'est moi qui souligne)

3
pjz

[Poster une nouvelle réponse, car je ne peux pas commenter la réponse de Josef.]

Le filtre de saisie fonctionne bien, mais il comporte un bogue subtil: taper sur une sélection supprimera tout le texte.

Par exemple, supposons que le texte "foo" figure dans la variable EditText. Si vous sélectionnez tout (par exemple, en double-cliquant dessus) et tapez 'a', le texte disparaîtra. C'est parce que la InputFilter sera appelée comme:

filter("a", 0, 1, "foo", 0, 3);

Le filtre d'entrée proposé renvoie dans ce cas la chaîne vide (car src.length() < 1 est false), ce qui explique le texte manquant.

La solution consiste simplement à renvoyer dst.subSequence(dstart, dend) dans la fonction de filtrage. Cela fonctionnera bien même pour les suppressions.

3
dlazar

Je ne vois pas de méthode associée à cet attribut dans la classe EditText Cependant, vous pouvez utiliser d'autres fonctions similaires telles que Android:focus/setFocusable(boolean) ou créer un autre TextView dont Android:editable="false" et utiliser setVisiblilty() pour basculer entre les vues Éditable et non éditable. Si vous utilisez View.GONE, l'utilisateur ne saura jamais qu'il existe deux EditTexts.

Si vous vous sentez ambitieux, vous pourriez probablement faire quelque chose avec l'auditeur onTextChanged de EditText, comme le faire réagir avec une setText.

3
Will

Je suppose

Edittext.setEnabled(false); 

par le code 

et 

Android:enabled="false"

via xml.Also vérifier ce post sur SO .

Ils devraient fonctionner et vous pouvez réactiver le programme Edittext.setEnabled(true); 

2
Anirudh Sharma

Je voulais également souligner une solution alternative qui fonctionne bien si vous créez de nouvelles instances d'un EditView. Vous pouvez remplacer la méthode getDefaultEditable () comme suggéré par la documentation pour renvoyer false. Par exemple.

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};
1
Timo

La seule solution que j'ai trouvée pour ce scénario consiste à créer 2 mises en page. On est éditable et on ne l’est pas. Vous devrez peut-être créer plus de 2 mises en page en fonction de différentes conditions. Stockez les conditions dans des références partagées ou d'autres moyens et chargez la mise en page appropriée en fonction des conditions après le redémarrage de l'activité. Voici un exemple:

dans onCreate () de l'activité:

    configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
    manualSettingsMode = configuration.isManualSettingsMode();
    if(manualSettingsMode){
        setContentView(R.layout.editableconfigurationsettings);
    }else {
        setContentView(R.layout.configurationsettings);
    }

L'activité peut être redémarrée en fonction des tests de condition et des fonctions d'appel sous la forme:

private void setManualEditing(){
    configuration.set_isManualSettingsMode(true);
    this.recreate();
}

private void setAutoEditing(){
    configuration.set_isManualSettingsMode(false);
    this.recreate();
}

J'espère que cela t'aides. Il doit vraiment y avoir une meilleure solution, mais c'est ce que je faisais. L'idéal serait de pouvoir le faire sur des champs individuels sans avoir à recharger l'activité/les mises en page. -policier

0
Bobby Schultz