Question

Dans la disposition, vous pouvez définir le EditText le widget n'est pas éditable via le android:editable attribute.

Comment puis-je faire cela dans le code? J'ai besoin de faire le EditText Le widget est modifiable en fonction des conditions.

Était-ce utile?

La solution

Je pense qu'un InputFilter qui rejette 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) : "";
        }
    }
});

Éditer: Dlazar a suggéré (ci-dessous) de changer le return à dst.subSequence(dstart, dend) pour surmonter le comportement qui supprime les mots.

Autres conseils

editText.setFocusable(false);
editText.setClickable(false);

Cela garantit le EditText Le contrôle ne peut pas être sélectionné et ciblé, il ne peut donc pas être modifié.

Je viens d'essayer moi-même,

Pour désactiver le texte d'édition:

.setFocusable(false);

Cela définit également setFocusableIntUchMode à false!

Pour activer le texte de modification:

setFocusableInTouchMode(true);

Cela définit également SetFocausable sur true;

La meilleure façon de le faire est avec cette seule ligne de code:

textView.setKeyListener(null);

Les documents disent pour cette méthode:

Définit l'auditeur clé à utiliser avec ce TextView. Cela peut être nul pour interdire l'entrée de l'utilisateur.

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

Vous pouvez essayer ceci:

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

Cela désactivera complètement EditText, désactivera la presse longue si vous ne souhaitez pas que l'utilisateur ouvre les options de texte de modification.

Je ne vois pas de méthode connexe pour cet attribut dans la classe EditText. Cependant, il y a d'autres choses similaires que vous pourriez utiliser commeandroid:focus/setFocusable(boolean) ou créer un autre TextView dontandroid:editable="false" et utilise setVisiblilty() pour basculer entre les vues modifiables et non modifiables. Si tu utilises View.GONE L'utilisateur ne saura jamais qu'il y a deux textes d'édition.

Si vous vous sentez ambitieux, vous pourriez probablement faire quelque chose avec le EditText onTextChanged auditeur comme l'avoir réagi avec un setText.

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

Le filtre d'entrée fonctionne bien, mais il contient un bug subtil: la saisie d'une sélection supprimera tout le texte.

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

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

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

La solution consiste à revenir simplement dst.subSequence(dstart, dend) Dans la fonction filtrante. Cela fonctionnera bien même pour les suppressions.

As-tu essayé setText (java.lang.charsequence, android.widget.textview.buffertype) ? Il est décrit comme:

Définit le texte que ce TextView est à afficher (voir SetText (CharSequence)) et définit également s'il est stocké dans un tampon styléable / spannable Et si c'est modifiable.

(met l'accent sur la mienne)

Je suppose

Edittext.setEnabled(false); 

via le code

et

android:enabled="false"

via XML. Vérifiez également ce message sur ALORS.

Ils devraient fonctionner et vous pouvez activer à nouveau programmatiquement Edittext.setEnabled(true);

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 les documents pour retourner false. Par exemple

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

La seule solution que j'ai trouvée pour ce scénario est de créer 2 dispositions. L'un est modifiable et un ne l'est pas. Vous devrez peut-être créer plus de 2 dispositions en fonction de diverses conditions. Stockez les conditions dans des préférences partagées ou d'autres moyens et chargez la disposition pertinente 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 pour les fonctions de condition et d'appel comme suit:

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 fais. Idéalement, on pourrait le faire sur des champs individuels et ne pas avoir à recharger l'activité / les dispositions. -policier

Je pense que la bonne façon d'atteindre l'effet souhaité est:

mEditView.setText("my text", BufferType.NORMAL);

Si vous souhaitez basculer entre modifiable et non modifiable, vous pouvez effectuer ce qui suit:

// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);

// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);

essaye ça:

 mEditText.setFilters(new InputFilter[]{new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (XXX) {
                return "";
            } else {
                return null;
            }
        }
    }});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top