2017-09-06 5 views
1

Je commence par un par programme créé AutoCompleteTextView voir sur ma mise en page. Après que l'utilisateur a tapé des données valides dans le champ, je crée un nouvel objet AutoCompleteTextView juste sous le premier, de la même manière, avec les mêmes paramètres. Je stocker toutes les références sur le terrain dans un ArrayList pour suivre le dernier, de cette façon que je me assure qu'il y aura de nouveaux champs que sous celui au fond (essentiellement le dernier élément de la liste de référence) - Alors ça continue sur tous les terrains.Android AutoCompleteTextView - gérer l'option dynamique IME modifier en "re-sélection" vue

Je voudrais ajouter cette fonctionnalité: lorsqu'un nouveau champ est créé, je change la dernière des options de terrain à ÉMI EditorInfo.IME_ACTION_NEXT et nextFocusForward attribut au champ fraîchement créé - également par programmation. Ce que je veux réaliser: juste quand l'utilisateur appuie sur Entrée sur le clavier, la focalisation du dernier champ saute au nouveau champ. J'utilise ce code pour définir de nouvelles options IME:

ArrayList<AutoCompleteTextView> fields = new ArrayList<>(); 

//Creating freshlyCreatedField, IT'S STILL NOT IN THE fields LIST! 

AutoCompleteTextView currentlySelectedField = fields.get(fields.size() - 1); // last element 

currentlySelectedField.setImeOptions(EditorInfo.IME_ACTION_NEXT); 
currentlySelectedField.setNextFocusForwardId(freshlyCreatedField.getId()); 
currentlySelectedField.setSingleLine(true); //ACTV needs it to get IME to work 

//Adding freshlyCreatedField to the fields list, 
//so next time it will be the currentlySelectedField 

Mais après l'exécution de ce code ne passe à l'objet AutoCompleteTextView actuellement sélectionné. Effacer et demander la mise au point ne fonctionnait pas, et le faire fonctionner de manière inversée (créer un champ "invisible" (techniquement GONE) à chaque fois) serait beaucoup plus douloureux.

Encore une chose: après avoir sélectionné un autre champ et re-sélectionner celui avec les changements de configuration le bouton Entrée fonctionne comme il se doit pour la première fois! Si je pouvais faire la même chose par programme, cela résoudrait mon problème ... alors, des idées pour le faire? (Bien sûr, je me réjouis également de meilleures solutions ...;))

Répondre

0

Après quelques jours, j'ai commencé à jouer avec ce problème nouveau. Oui, il est une solution, mais pas, ce n'est pas si jolie que je pour être comme ...

Quoi qu'il en soit, j'ai créé ce code:

ArrayList<AutoCompleteTextView> fields = new ArrayList<>(); 

//Creating freshlyCreatedField, IT'S STILL NOT IN THE fields LIST! 

//Last element 
AutoCompleteTextView currentlySelectedField = fields.get(fields.size() - 1); 

currentlySelectedField.setOnEditorActionListener(
     new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     boolean handled = false; 
     if (actionId == EditorInfo.IME_ACTION_NEXT 
       || actionId == EditorInfo.IME_ACTION_DONE 
       || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { 
      freshlyCreatedField.requestFocus(); 
      handled = true; 
     } 

     return handled; 
    } 
}); 

//Adding freshlyCreatedField to the fields list, 
//so next time it will be the currentlySelectedField 

Je mets un EditorActionListener au champ effectivement en cours d'édition où le clavier écoute pour l'un des IME_ACTION_NEXT (si elle est déjà défini) et IME_ACTION_DONE ID d'action (c'est la valeur par défaut), ou pour la Entrez clé (pour le c ase si quelqu'un voudrait utiliser le clavier physique). Ensuite, il saute dans le champ ci-dessous.

Cela fonctionne très bien, il n'y a pas de problèmes terribles avec cette approche. Cependant, je suis un peu triste, car toutes ces possibilités restent invisibles. Le Terminé le bouton d'action passe à Suivant seulement en cliquant à un autre endroit comme je l'ai écrit dans ma question. Donc je pense que ma "solution" peut fonctionner, mais ce n'est pas la meilleure réponse, alors n'hésitez pas à écrire vos pensées si vous avez une autre idée ... :)