84 votes

Mettre un texte constant dans un EditText qui ne devrait pas être modifiable - Android

Je veux avoir un texte constant à l'intérieur de editText comme :

http://<here_user_can_write>

L'utilisateur ne doit pas pouvoir supprimer des caractères de " http:// "J'ai fait des recherches à ce sujet et j'ai trouvé ceci :

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) : "";
        }
    }
}); 

mais je ne sais pas s'il restreint l'utilisateur à ne pas supprimer de caractères de du début à la fin limite. Je n'ai pas non plus compris l'utilisation de la classe Spanned.

Un bon choix serait de mettre en place une TextView à l'intérieur EditText mais je ne pense pas que ce soit possible dans Android puisque les deux sont des Vues, est-ce possible ?

1voto

Pavel Kataykin Points 831

Le code ci-dessous fonctionne pour moi. Il gère les cas où l'utilisateur modifie le préfixe, le supprime, insère du texte à partir de la mémoire tampon, modifie le texte sélectionné. Si l'utilisateur modifie le préfixe, le focus se déplace à la fin du préfixe.

    final String prefix = "http://";
    final String[] aLastText = {prefix};
    et.setText(prefix);
    et.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable sNew) {

            if (!sNew.toString().startsWith(prefix)) {
                String sLast = aLastText[0];
                boolean isRemoving = sNew.length() < sLast.length();

                int start;
                int end = sNew.length() - 1;
                for (start = 0; start < sLast.length() && start < sNew.length(); start++) {
                    if (sLast.charAt(start) != sNew.charAt(start)) 
                        break;
                }
                int k = sLast.length() - 1;
                for (; end >= start && k >= 0; end--, k--) {
                    if (sLast.charAt(k) != sNew.charAt(end)) 
                        break;
                }
                String sEdited = sNew.toString().substring(start, ++end);
                k += isRemoving ? 1 : 0;
                k = k < prefix.length() ? prefix.length() : k;
                String sSuffix = sLast.substring(k, sLast.length());

                et.setText(prefix + sEdited + sSuffix);
                et.setSelection(et.getText().length() - sSuffix.length());
            }
            aLastText[0] = et.getText().toString();
        }
    });

Exemples :

ht5tp://localhost, 5http://localhost, http:/5/localhost -> http://5localhost

http:localhost -> http://localhost

0voto

Hammad Syarif Points 61

Ce qui a fonctionné pour moi, c'est d'apporter quelques modifications au code de Rajitha Siriwardena :

Première , mettre du texte sur le Edittext ou TextInputEditText xml layout :
android:text="http://" l'objectif est de tester la condition if du premier coup

Deuxième , tester la condition avec if comme ceci

@Override
public void afterTextChanged(Editable s) {
if (!s.toString().startsWith("http://")) {
    etPhone.setText("http://");
    etPhone.setSelection(etPhone.length());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X