2012-07-01 6 views
4

Je suis toujours un débutant dans Android et j'essaie de travailler mon chemin autour des boîtes de texte autocomplete. J'utilise MultiAutoCompleteTextView pour remplir une zone de texte et fournir des indications à partir d'un tableau de chaînes. Chaque chaîne du tableau est le nom d'un objet qui a un identifiant. Donc, ma question est double:Android Autocomplete

  • Après que l'utilisateur clique sur une entrée donnée sur l'auto-complétion, comment puis-je trouver l'identifiant qui correspond à la chaîne choisie par l'utilisateur? Est-il en quelque sorte possible de créer une "boîte Facebook" autour de l'élément qui est choisi dans la liste de saisie semi-automatique, qui fonctionne comme des unités atomiques que l'utilisateur peut supprimer en appuyant sur un X? (Semblable à ce qui se passe dans chaque étiquette sur la boîte d'étiquette ici stackoverflow)

Merci à l'avance

Répondre

4

Android a le code source des widgets "Chips" utilisés dans l'application Mail. Ce sont les puces qui représentent les utilisateurs qui sont les destinataires du message. Et ils ressemblent aux widgets Facebook auxquels vous faites référence: un nom avec un "X" à annuler. J'ai été en mesure de modifier le code et le rendre utilisable pour mes propres besoins, mais pour être honnête, c'est vraiment complexe et il m'a fallu beaucoup de temps pour envelopper ma tête autour d'elle.

Le principe de base est que vous utilisez Spannable chaînes et dessinez les images bitmap pour l'arrière-plan et le «X» manuellement.

Voici le code source Android: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/com/android/ex/chips/RecipientEditTextView.java

Les méthodes de base sont createSelectedChip, constructChipSpan.

+0

Hmm, grand, cela va le faire, je vous remercie! Je pensais qu'il y avait un moyen "prédéfini" de le faire sous Android, mais cela lui donne plus de flexibilité. :) – Sagito

+0

Pouvons-nous utiliser cette bibliothèque de puces dans nos projets? Ou y a-t-il des problèmes de licence? –

+0

Depuis que j'ai publié ma réponse j'ai depuis découvert ce paquet: https://github.com/splitwise/TokenAutoComplete –

4

Je ai ouvert un TokenAutoComplete on github qui résout assez bien. Il ne semble pas y avoir de réponse plus simple.Voici une implémentation de base de ce que vous décrivez:

public class ContactsCompletionView extends TokenCompleteTextView { 
    public ContactsCompletionView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected View getViewForObject(Object object) { 
     Person p = (Person)object; 

     LayoutInflater l = (LayoutInflater)getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     LinearLayout view = (LinearLayout)l.inflate(R.layout.contact_token, (ViewGroup)ContactsCompletionView.this.getParent(), false); 
     ((TextView)view.findViewById(R.id.name)).setText(p.getName()); 

     return view; 
    } 

    @Override 
    protected Object defaultObject(String completionText) { 
     //Stupid simple example of guessing if we have an email or not 
     int index = completionText.indexOf('@'); 
     if (index == -1) { 
      return new Person(completionText, completionText.replace(" ", "") + "@example.com"); 
     } else { 
      return new Person(completionText.substring(0, index), completionText); 
     } 
    } 
} 

Code de mise en page pour contact_token (vous aurez besoin de trouver votre propre x drawable)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:background="@drawable/token_background"> 
    <TextView android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="@android:color/white" 
     android:textSize="14sp" 
     android:text="Test Me" 
     android:padding="2dp" /> 

    <ImageView 
     android:layout_height="10dp" 
     android:layout_width="10dp" 
     android:src="@drawable/x" 
     android:layout_gravity="center_vertical" 
     android:layout_marginLeft="3dp" 
     android:layout_marginRight="5dp" /> 
</LinearLayout> 

Token backgound drawable

<shape xmlns:android="http://schemas.android.com/apk/res/android" > 
    <solid android:color="#ffafafaf" /> 
    <corners 
     android:topLeftRadius="5dp" 
     android:bottomLeftRadius="5dp" 
     android:topRightRadius="5dp" 
     android:bottomRightRadius="5dp" /> 
</shape> 

personne code objet

public class Person implements Serializable { 
    private String name; 
    private String email; 

    public Person(String n, String e) { name = n; email = e; } 

    public String getName() { return name; } 
    public String getEmail() { return email; } 

    @Override 
    public String toString() { return name; } 
} 

activité Exemple

public class TokenActivity extends Activity { 
    ContactsCompletionView completionView; 
    Person[] people; 
    ArrayAdapter<Person> adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     people = new Person[]{ 
       new Person("Marshall Weir", "[email protected]"), 
       new Person("Margaret Smith", "[email protected]"), 
       new Person("Max Jordan", "[email protected]"), 
       new Person("Meg Peterson", "[email protected]"), 
       new Person("Amanda Johnson", "[email protected]"), 
       new Person("Terry Anderson", "[email protected]") 
     }; 

     adapter = new ArrayAdapter<Person>(this, android.R.layout.simple_list_item_1, people); 

     completionView = (ContactsCompletionView)findViewById(R.id.searchView); 
     completionView.setAdapter(adapter); 
     completionView.setTokenClickStyle(TokenCompleteTextView.TokenClickStyle.Delete); 
    } 
} 

code mise en page

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.tokenautocomplete.ContactsCompletionView 
     android:id="@+id/searchView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 

Voici l'interface que vous obtenez:

Image of working TokenAutoComplete activity

+0

comment puis-je obtenir toutes les valeurs sélectionnées? Je veux dire que si l'utilisateur a entré une adresse e-mail qui ne figure pas dans la liste des tableaux définis, comment pouvons-nous l'obtenir également? – Scorpion

+0

getObjects renvoie tous les objets pour les jetons dans le champ. Si c'est un nouvel objet, ce sera la valeur que vous avez retournée de defaultObject –

+0

Bonjour monsieur, j'ai un problème. je veux supprimer onclick de l'image de marque croisée. Puis-je savoir comment faire ce style de jeton. – Rajasekhar