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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 confirmé

    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
    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 .

  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
    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 confirmé

    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
    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

  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
    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
    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.

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