IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Combobox : drop down item personnalisé ?


Sujet :

Composants graphiques Android

  1. #1
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut Combobox : drop down item personnalisé ?
    Salut,

    Je débute sur Android, et je voudrais faire quelque chose de très simple.

    J'ai une combobox, quand je clique dessus, j'ai la liste des éléments qui s'ouvre dans une "popup", et je dois en choisir un (un radio bouton est affiché à droite).

    Jusque là, tout va bien.

    Maintenant, je voudrais personnaliser le renderer de cette liste, pour y mettre une image (dépendant de l'item) à la place du radiobutton.

    Par exemple, si j'ai une liste de "luminosité" avec comme valeur "faible", "moyenne" et forte", je veux mettre une image d'ampoule à faible luminosité, à moyenne luminosité et à forte luminosité, respectivement.

    Mais là je rencontre deux problèmes.

    Pour expliquer, voici le code. Dans mon activity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Spinner spinner = (Spinner) findViewById(R.id.spinner1);
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.brightnesses, android.R.layout.simple_spinner_item);
    //        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            adapter.setDropDownViewResource(R.layout.item);
            spinner.setAdapter(adapter);
        }
    Comme vous le voyez, j'ai remplacé le "dropdownitem" par défaut (ligne en commentaire) par mon propre renderer (R.layout.item).

    Pour commencer, ce fichier XML contient exactement ce que contient android.R.layout.simple_spinner_dropdown_item :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@android:id/text1"
        style="?android:attr/spinnerDropDownItemStyle"
        android:singleLine="true"
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight" />
    Évidemment, ça fonctionne.

    Maintenant, je remplace ce .xml avec un renderer personnalisé, par exemple un label suivi d'un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
        <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="TextView" android:id="@+id/textView1" android:layout_weight="1"></TextView>
        <Button android:layout_height="wrap_content" android:id="@+id/button1" android:layout_width="wrap_content" android:text="Button"></Button>
    </LinearLayout>
    Là ça fait planter l'application.
    N'est-il pas possible d'utiliser un "LinearLayout" dans un renderer ? Quel est le problème ?

    Maintenant, supposons cette première étape résolue, comment "exécuter du code" pour initialiser les autres composants du renderer (sur cet exemple, il faut initialiser le textview + le bouton).

    Merci de votre aide.

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.brightnesses, android.R.layout.simple_spinner_item);
    En même temps tu spécifie à ton adapter que tu as un textView (android.R.layout.simple_spinner_item) comme root non ?

    public static ArrayAdapter<CharSequence> createFromResource (Context context, int textArrayResId, int textViewResId)

    Since: API Level 1
    Creates a new ArrayAdapter from external resources. The content of the array is obtained through getTextArray(int).
    Parameters

    context The application's environment.
    textArrayResId The identifier of the array to use as the data source.
    textViewResId The identifier of the layout used to create views.
    Returns

    An ArrayAdapter.
    Il faudrait que tu personnalises également ton ArrayAdapter .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Merci de ta réponse.

    Ce n'est pas bien clair pour moi la différence (ou la relation) entre le resId qu'on passe en paramètre de createFromResource (de l'ArrayAdapter), et celui qu'on passe en paramètre de setDropDownViewResource.

    Pourrais-tu m'éclairer ?
    (je m'en vais lire ça en attendant)

    EDIT: ce tuto devrait m'aider ;-)

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Je viens de trouver un exemple dans le forum, après une recherche

    http://www.developpez.net/forums/d88...dapter-widget/

    public static ArrayAdapter<CharSequence> createFromResource (Context context, int textArrayResId, int textViewResId)

    Since: API Level 1
    Creates a new ArrayAdapter from external resources. The content of the array is obtained through getTextArray(int).
    Parameters

    context The application's environment.
    textArrayResId The identifier of the array to use as the data source.
    textViewResId The identifier of the layout used to create views.
    Returns

    An ArrayAdapter.
    Donc même pas moyen d'utiliser cette fonction de création alors .


    Créer ton adapter via un constructeur puis mets à jour son layout avec cette fonction setDropDownViewResource
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Bon, j'ai avancé un peu, j'ai créé mon propre Adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class BrightnessAdapter extends BaseAdapter {
     
        private Context context;
        private String[] data;
        private LayoutInflater inflater;
     
        public BrightnessAdapter(Context context, String[] data) {
            this.context = context;
            this.data = data;
            inflater = LayoutInflater.from(context);
        }
     
        @Override
        public int getCount() {
            return data.length;
        }
     
        @Override
        public String getItem(int position) {
            return data[position];
        }
     
        @Override
        public long getItemId(int position) {
            return position;
        }
     
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.item, parent, false);
            }
     
            TextView label = (TextView) convertView.findViewById(R.id.textView1);
            Button button = (Button) convertView.findViewById(R.id.button1);
     
            label.setText(getItem(position));
            button.setText(String.valueOf(position));
     
            return convertView;
        }
    }
    Et je l'utilise comme ceci dans mon activité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Spinner spinner = (Spinner) findViewById(R.id.spinner1);
            String[] data = getResources().getStringArray(R.array.brightnesses);
            spinner.setAdapter(new BrightnessAdapter(this, data));
            spinner.setOnItemSelectedListener(new BrightnessSelectedListener());
        }
    Ça fonctionne :
    < image externe indisponible !! >

    Par contre, il doit falloir gérer les événements manuellement, car là la popup reste toujours ouverte, je ne peux rien sélectionner et je ne peux pas la fermer.

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Pour que la sélection fonctionne (que la popup se ferme et que mon BrightnessSelectedListener soit appelé), que dois-je faire ?

    Dois-je ajouter un écouteur à la fois sur le textfield et sur le bouton ?

    Que dois-je faire sur le handler pour :
    - fermer la popup
    - retourner l'élément sélectionné (et sa position)
    - que le fond de l'item change de couleur lorsqu'on clique dessus, comme dans le comportement par défaut (faut-il le faire manuellement ou peut-on réutiliser le comportement par défaut d'une manière ou d'une autre)

    Merci.

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Pour que la sélection continue de fonctionner, il faut dire aux composants (TextView et Button ici) de ne pas capturer les événements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     android:focusable = "false"
     android:clickable = "false"
    Problème résolu ;-)

    (Enfin il reste encore le problème de la flèche de droite du ComboBox qui n'apparaît pas correctement quand le contenu prend plus de place en hauteur)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 322
    Points : 494
    Points
    494
    Par défaut
    Bonjour,
    Tu devrais peut être regarder du coté des attributs xml maxHeight et maxLines.

    J'ai l'impression que c'est à cause du bouton que la flèche est déformée. Tu devrais essayer de changer le style du bouton en mettant par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    style="?android:attr/buttonStyleSmall"

Discussions similaires

  1. Item de TMainMenu auto drop down
    Par BuzzLeclaire dans le forum Débuter
    Réponses: 6
    Dernier message: 06/11/2012, 12h31
  2. Supprimer des items dans une drop down liste
    Par msahmi dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/04/2008, 10h59
  3. pb avec ma comboBox style drop down list
    Par Emilewawal dans le forum C#
    Réponses: 4
    Dernier message: 07/02/2008, 16h15
  4. [AutoComplétion] Drop down list
    Par tintin31000 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/10/2005, 15h37
  5. Réponses: 2
    Dernier message: 08/04/2004, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo