web-dev-qa-db-fra.com

Android: indice Spinner

Existe-t-il de toute façon une astuce pour un spinner similaire à l'astuce qui est fournie pour modifier les champs de texte. Je sais que vous pouvez utiliser une invite qui vous donne une barre de titre mais laisse toujours le champ de spinner initial vide jusqu'à ce que vous cliquiez dans le spinner. J'ai actuellement une manière grossière de définir un champ fictif comme première partie du tableau de spinner qui est la question, puis je vérifie à la fin pour m'assurer que le spinner n'est pas égal à la chaîne de question. Existe-t-il un moyen plus propre/meilleur de procéder?

Merci!

51
Nick

Voici une solution qui est probablement un peu plus simple que le code Ravi Vyas (merci pour l'inspiration!):

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), Android.R.layout.simple_spinner_dropdown_item) {

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = super.getView(position, convertView, parent);
        if (position == getCount()) {
            ((TextView)v.findViewById(Android.R.id.text1)).setText("");
            ((TextView)v.findViewById(Android.R.id.text1)).setHint(getItem(getCount())); //"Hint to be displayed"
        }

        return v;
    }       

    @Override
    public int getCount() {
        return super.getCount()-1; // you dont display last item. It is used as hint.
    }

};

adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
adapter.add("Item 1");
adapter.add("Item 2");
adapter.add("Hint to be displayed");

spinner.setAdapter(adapter);
spinner.setSelection(adapter.getCount()); //display hint
146
Boni2k

Vous pouvez configurer votre propre adaptateur spinner et remplacer la méthode getView pour afficher l'indice au lieu d'un élément. J'ai créé un exemple de projet sur github, consultez-le ici

23
Ravi Vyas

Un moyen encore plus simple que de configurer votre propre adaptateur spinner consiste à simplement utiliser un bouton et à le styliser comme un objet spinner avec

Android:background="@Android:drawable/btn_dropdown"

Configurez ensuite l'événement onClick du bouton pour ouvrir une boîte de dialogue de sélection d'un seul élément. Vous pouvez ensuite faire ce que vous voulez avec le texte du bouton.

C'est ma façon préférée de gérer cela depuis un moment. J'espère que cela aide quelqu'un.

EDIT: J'ai recommencé avec ça récemment (et quelqu'un m'a demandé de poster un exemple il y a un moment). Cette stratégie sera un peu différente si vous utilisez le thème Holo. Cependant, si vous utilisez d'autres thèmes tels que Theme.Black, cela aura l'air identique.

Pour démontrer cela, j'ai créé une application simple qui a à la fois un Spinner ordinaire et mon bouton-spinner personnalisé. J'ai jeté ça dans un repo GitHub , mais voici à quoi ressemble l'activité:

package com.stevebergamini.spinnerbutton;

import Android.app.Activity;
import Android.app.AlertDialog;
import Android.content.DialogInterface;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.Spinner;

public class MainActivity extends Activity {

    Spinner spinner1;
    Button button1;
    AlertDialog ad;
    String[] countries;

    int selected = -1;

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

        spinner1 = (Spinner) findViewById(R.id.spinner1);
        button1 = (Button) findViewById(R.id.button1);

        countries = getResources().getStringArray(R.array.country_names);

        //  You can also use an adapter for the allert dialog if you'd like
        //  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, Android.R.layout.simple_spinner_dropdown_item, countries);        

        ad = new AlertDialog.Builder(MainActivity.this).setSingleChoiceItems(countries, selected,  
                new  DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            button1.setText(countries[which]);
                            selected = which;
                            ad.dismiss();

                        }}).setTitle(R.string.select_country).create(); 


        button1.setOnClickListener( new OnClickListener(){

            @Override
            public void onClick(View v) {
                ad.getListView().setSelection(selected);
                ad.show();              
            }});

    }
}
15
SBerg413