8
votes

Édition en direct des utilisateurs entrées

est-il possible d'insérer automatiquement des caractères dans un eittext car l'utilisateur entrait les données ?

I.e. Si l'utilisateur entre dans un nombre long, tel que 123456789012 , est-il possible que ce numéro apparaisse car il le tape dans la zone Edition de texte, mais avec un tableau de bord tous les 4e personnages?

Alors que vous tapez le nombre ci-dessus, vous le verriez être entré dans la case editext mais ressemblerait à ceci: 1234-5678-9012.

Actuellement, j'ai une application où vous pouvez entrer un nombre long, puis appuyer sur un bouton et elle insère les tirets pour vous, mais je suis curieux s'il pouvait être fait comme vous tapez?

Merci beaucoup pour toute aide.


2 commentaires

Quelle langue? Quelle plate-forme? Ceci, en général, est possible, mais les détails dépendent de la langue et de la plate-forme.


Dans quelle technologie? Par exemple. Dans une page Web, une application iPhone, etc.


6 Réponses :


12
votes

En marquant Android, je pense que vous discutez de Android EditText, c'est ainsi que vous pouvez le faire en écoutant le TextChangeDlistener,

édité: pour Backspace P>

editText.addTextChangedListener(new TextWatcher() {
            int len=0;
            @Override
            public void afterTextChanged(Editable s) { 
                String str = editText.getText().toString(); 
                 if(str.length()==4&& len <str.length()){//len check for backspace 
                    editText.append("-");
                }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

             String str = editText.getText().toString(); 
              len = str.length();
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {  
            }


        }); 


8 commentaires

Super. Merci beaucoup pour la réponse.


Faites également des suppression des suppressions - l'exemple donné peut rendre impossible l'espace de retour après avoir saisi 4 caractères (comme la suppression du tableau de bord ajoutera immédiatement un autre dos).


@Nick, je l'ai édité pour le retour arrière, donc ce n'est pas impossible


@LabebeBP J'ai essayé de l'utiliser. Mais si j'appuie sur l'espace arrière. - Ne supprimera pas aussi. Aussi une fois qu'un aperçu de tiret dans l'editext, le curseur sera déplacé pour transmettre


Cela n'ajoute pas de tirets à mon editext. Qu'est-ce qui pourrait être la raison?


La même chose que @figen güngör pour moi


C'était également ajouté seulement pour une fois, comment dois-je ajouter plusieurs fois?


J'ai changé mon type d'entrée EditText en nombre et j'ai donné des chiffres à "0123456789-" et fonctionne parfaitement. Merci d'avoir répondu.



0
votes
@Override
public void afterTextChanged(Editable s) {

    if(s.length() == 3 && len < s.length()){
        s.append(" - ");
    }

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
    len = s.length();
}
This will do as well, only this code will insert " - " after 3rd character. 

0 commentaires

0
votes

C'est ce que j'ai utilisé xxx

ici, vous remplacez le délimiteur avec ce que vous voulez séparer les chiffres.


0 commentaires

0
votes

Pour ceux qui sont toujours confrontés à des problèmes avec l'espace de retour et des traits d'union multiples -

new TextWatcher() 
{
        boolean hyphenExists;

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            if (s.length() >= 6 && s.charAt(5) == '-') {
                hyphenExists = true;
            } else {
                hyphenExists = false;
            }

            Log.d("TAG", "beforeTextChanged " + s.toString());
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            Log.d("TAG", "onTextChanged " + s.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {
            if (s.length() == 5) {
                if (!hyphenExists)
                    s.append('-');
            }
            Log.d("TAG", "afterTextChanged " + s.toString());
        }
    }


0 commentaires

7
votes

Pour résoudre ce problème, j'écris une classe "autoaddtextwatcher":

1. Insérez automatiquement le texte dans EditText.
2. Insérez du texte dans EditText à des positions que vous êtes réglés.
3. Supprimer le texte dans editext à des positions Vous êtes réglé, lorsque la longueur de texte plus grande que 1.

 Entrez l'image Description ici P>

Code Snippet: P>

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;


/**
 * Created by henry.chuang on 2016/5/12.
 */
public class AutoAddTextWatcher implements TextWatcher {
    private CharSequence mBeforeTextChanged;
    private TextWatcher mTextWatcher;
    private int[] mArray_pos;
    private EditText mEditText;
    private String mAppentText;

    public AutoAddTextWatcher(EditText editText, String appendText, int... position){
        this.mEditText = editText;
        this.mAppentText = appendText;
        this.mArray_pos = position.clone();
    }
    public AutoAddTextWatcher(EditText editText, String appendText, TextWatcher textWatcher, int... position){
        this(editText, appendText, position);
        this.mTextWatcher = textWatcher;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        mBeforeTextChanged = s.toString();

        if(mTextWatcher != null)
            mTextWatcher.beforeTextChanged(s, start, count, after);

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        for (int i = 0; i < mArray_pos.length; i++) {
            if(((mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] - 1) &&
                    (s.length() - mAppentText.length() * i) == mArray_pos[i])){
                mEditText.append(mAppentText);

                break;
            }

            if(((mBeforeTextChanged.length() - mAppentText.length() * i) == mArray_pos[i] &&
                    (s.length() - mAppentText.length() * i) == (mArray_pos[i] + 1))){
                int idx_start = mArray_pos[i] + mAppentText.length() * i;
                int idx_end = Math.min(idx_start + mAppentText.length(), s.length());

                String sub = mEditText.getText().toString().substring(idx_start,  idx_end);

                if(!sub.equals(mAppentText)){
                    mEditText.getText().insert(s.length() - 1, mAppentText);
                }

                break;
            }

            if(mAppentText.length() > 1 &&
                    (mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length()) &&
                    (s.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length() - 1)){
                int idx_start = mArray_pos[i] + mAppentText.length() * i;
                int idx_end = Math.min(idx_start + mAppentText.length(), s.length());

                mEditText.getText().delete(idx_start, idx_end);

                break;
            }

        }

        if(mTextWatcher != null)
            mTextWatcher.onTextChanged(s, start, before, count);

    }

    @Override
    public void afterTextChanged(Editable s) {
        if(mTextWatcher != null)
            mTextWatcher.afterTextChanged(s);

    }

}


8 commentaires

Wow mec! Tu es un génie! Merci beaucoup pour cela ... J'ai essayé tant de solutions, mais rien ne fonctionnait bien. J'avais besoin de le faire formaté comme celui-ci: 12-345-67. Toutes les autres solutions ont toujours eu des choses étranges se produisent lorsque vous avez supprimé et ensuite essayé de rentrer. Vos solutions fonctionnent parfaitement! Une chose à noter cependant, pour que votre classe fonctionne correctement, vous devez définir le type d'entrée dans le fichier XML sur Android: INPUTTYPE = "TÉLÉPHONE" J'ai essayé initialement avec Android: INPUTYPE = "Numéro" et cela n'a pas fonctionné. J'ai vérifié votre page GitHub et vous a vu utiliser téléphone , et cela fonctionne maintenant. Bon travail!


Voici ma mise en œuvre: EnteruserId.addtextChangeDlistener (New AutoaddtextWatcher (Enteruserid, "-", 2, 5));


@Kevinbright remercie votre encouragement et votre suggestion, je vais l'essayer.


Non, merci! Je ne peux pas croire à quel point il est difficile de faire correctement à Android!


@Henrychuang: Votre code était super. Auparavant, j'ai mis en œuvre ma propre manière en luttant beaucoup. Mais votre code aidera les gens certainement. Si je veux mettre en œuvre la copie coller auditeur à votre code, comment pouvons-nous y parvenir.


@ Sham.y Copy Copolez-vous auditeur? Copier tout le texte sur edittext?


@Henrychuang: Oui, si l'utilisateur copié texte et collé dans Modifier le texte.


Bonjour, j'utilise cette classe, mais un problème que nous sommes observés est lorsque l'utilisateur apporte le curseur à l'arrière de la chaîne, la position de délimiteur est absente selon l'exigence. Pour vous suggérer s'il vous plaît suggérer de moi y avoir une solution pour cela.



0
votes

Vous pouvez y parvenir sur le texte modifié

dans mon cas, je dois formater une entrée comme celle-ci: xxx xxx-xxxx p>

i fait comme indiqué ci-dessous: p>

etMobileNumber.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {


        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            if (etMobileNumber.text.length == 3 && count != 0) {
                val text = etMobileNumber.getText().toString() + " "
                etMobileNumber.setText(text)
                etMobileNumber.setSelection(text.length)
            } else if (etMobileNumber.text.length == 7 && count != 0) {
                val text = etMobileNumber.getText().toString() + "-"
                etMobileNumber.setText(text)
                etMobileNumber.setSelection(text.length)
            }
        }
    })


0 commentaires