web-dev-qa-db-fra.com

Comment ajouter un indice dans spinner en XML

J'essaie d'ajouter un indice dans le widget spinner car il n'y a pas d'option d'indice car dans EditText, je souhaite afficher le genre comme un indice et lorsque vous cliquez dessus, il ne doit afficher que les options Homme et Femme, pas l'indice. 

Comment cela peut être fait uniquement en utilisant XML

Code XML de spinner.

  <Spinner
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content"
      Android:id="@+id/spinner1"
      Android:entries="@array/gender"
      Android:layout_marginTop="10dp"
      Android:layout_marginLeft="25dp"
      Android:layout_marginRight="25dp"
      Android:layout_gravity="center_horizontal" />

Tableau de cordes du spinner

<string-array name="gender">
     <item>Male</item>
     <item>Female</item>
</string-array>
33
A-JaY

Dans l'adaptateur, vous pouvez définir le premier élément comme étant désactivé. Ci-dessous l'exemple de code

@Override
public boolean isEnabled(int position) {
    if (position == 0) {
        // Disable the first item from Spinner
        // First item will be use for hint
        return false;
    } else {
        return true;
    }
}

Et définissez le premier élément en couleur grise.

@Override
public View getDropDownView(int position, View convertView,
                                    ViewGroup parent) {
    View view = super.getDropDownView(position, convertView, parent);
    TextView tv = (TextView) view;
    if (position == 0) {
        // Set the hint text color gray
        tv.setTextColor(Color.GRAY);
    } else {
        tv.setTextColor(Color.BLACK);
    }
    return view;
}

Et si l'utilisateur sélectionne le premier élément, il ne fait rien.

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    String selectedItemText = (String) parent.getItemAtPosition(position);
    // If user change the default selection
    // First item is disable and it is used for hint
    if (position > 0) {
        // Notify the selected item text
        Toast.makeText(getApplicationContext(), "Selected : " + selectedItemText, Toast.LENGTH_SHORT).show();
    }
}

Reportez-vous au lien ci-dessous pour plus de détails.

Comment ajouter un indice à Spinner dans Android

34
Dotnetpickles

Vous pouvez utiliser spinner de deux manières:

manière statique

Android:spinnerMode="dialog"

puis définissez:

Android:Prompt="@string/hint_resource"

manière dynamique

spinner.setPrompt("Gender");

Remarque: cela fonctionnera comme un indice, mais pas réellement.

Que cela aide!

9
Saurabh Vardani

Cela peut être fait d'une manière très simple. Au lieu de définir l'adaptateur à l'aide des valeurs intégrées (Android.R.layout.simple_list_item_1), créez votre propre mise en page XML pour TextView et DropDown et utilisez-les. Dans la disposition TextView, définissez le texte et la couleur de conseil. Dernière étape, créez et videz l’élément en tant que premier élément du tableau d’éléments défini dans Chaînes

<string-array name="professional_qualification_array">
    <item></item>
    <item>B.Pharm</item>
    <item>M.Pharm</item>
    <item>PharmD</item>
</string-array>

Créer une présentation XML pour Spinner TextView ( spnr_qualification.xml )

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@Android:id/text1"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textSize="20sp"
    Android:hint="Qualification"
    Android:textColorHint="@color/light_gray"
    Android:textColor="@color/blue_black" />

Créer une disposition XML pour spinner DropDown. ( drpdn_qual.xml )

<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@Android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
Android:maxLines="1"
Android:layout_width="match_parent"
Android:layout_height="?android:attr/listPreferredItemHeight"
Android:ellipsize="Marquee"
Android:textColor="#FFFFFF"/>

Définir spinner dans la mise en page XML principale

<Spinner
Android:id="@+id/spnQualification"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:layout_marginTop="10dp"
Android:paddingLeft="10dp"
Android:paddingBottom="5dp"
Android:paddingTop="5dp"
/>

Et enfin, dans le code, lors de la configuration de l'adaptateur pour le compteur, utilisez votre disposition XML personnalisée.

ArrayAdapter<CharSequence> qual_adapter = ArrayAdapter.createFromResource(this, R.array.professional_qualification_array,R.layout.spnr_qualification);

qual_adapter.setDropDownViewResource(R.layout.drpdn_qual);

spnQualification.setAdapter(qual_adapter)
4
Rajesh Ravindradas

Étape 1:

Votre tableau ressemble à. dernier élément de votre indice

Ex: private String [] yourArray = new String [] {"Personnel", "Étudiant", "Votre indice"};

Étape 2:

Créer HintAdpater.Java (il suffit de copier/coller)

Cette classe ne retourne pas le dernier élément. Ainsi, votre indice ne s'affiche pas.

HintAdapter.Java

package ajax.com.vvcoe.utils;

import Android.content.Context;
import Android.widget.ArrayAdapter;

import Java.util.List;


public class HintAdapter  extends ArrayAdapter<String> {


public HintAdapter(Context context, int resource) {
    super(context, resource);
}

public HintAdapter(Context context, int resource, int textViewResourceId) {
    super(context, resource, textViewResourceId);
}

public HintAdapter(Context context, int resource, String[] objects) {
    super(context, resource, objects);
}

public HintAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
    super(context, resource, textViewResourceId, objects);
}

public HintAdapter(Context context, int resource, List<String> objects) {
    super(context, resource, objects);
}

public HintAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
    super(context, resource, textViewResourceId, objects);
}

@Override
public int getCount() {
    // don't display last item. It is used as hint.
    int count = super.getCount();
    return count > 0 ? count - 1 : count;
}
}

Étape 3:

_ {Définir l'adaptateur spinner comme ceci} _

    HintAdapter hintAdapter=new HintAdapter(this,Android.R.layout.simple_list_item_1,yourArray);
    yourSpinner.setAdapter(hintAdapter);
    // show hint
    yourSpinner.setSelection(hintAdapter.getCount());

Le crédit va à @Yakiv Mospan De cette réponse - https://stackoverflow.com/a/22774285/3879847

Je ne modifie que quelques modifications ..

3
Ranjith Kumar

Le truc c'est cette ligne

((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));

utilisez-le dans le onItemSelected. Voici mon code avec plus de contexte

List<String> list = getLabels(); // First item will be the placeholder
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(mContext, Android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                // First item will be gray
                if (position == 0) {
                    ((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));
                } else {
                    ((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.primary_text));
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
2
David Rearte

faites votre indice à la position finale dans votre tableau de chaînes comme ceci Ville est l'indice ici 

array_city = new String[]{"Irbed", "Amman", "City"};

puis dans votre adaptateur de matrice 

ArrayAdapter<String> adapter_city = new ArrayAdapter<String>(getContext(), Android.R.layout.simple_spinner_item, array_city) {
            @Override
            public int getCount() {
                // to show hint "Select Gender" and dont able to select
                return 2;
            }
        };

donc l'adaptateur retourne juste les deux premiers éléments et enfin dans onCreate () method ou quoi , oblige Spinner à sélectionner l'indicateur 

yourSpinner.setSelection(2);

Vous pouvez définir l'invite spinner:

spinner.setPrompt("Select gender...");
0
Sam

J'ai réussi à ajouter un "indice" qui est omis de la liste déroulante. Si mon code a l'air un peu bizarre, c'est que j'utilise Xamarin.Android, donc c'est en C #, mais à toutes fins utiles (hé), l'équivalent Java devrait avoir le même effet.

En résumé, j'ai créé un ArrayAdapter personnalisé qui détectera s'il s'agit du conseil de la méthode GetDropDownView. Si tel est le cas, un code XML vide sera gonflé pour masquer le conseil dans le menu déroulant.

Mon spinnerItem.xml est ...

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/spinnerText"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:paddingLeft="@dimen/text_left_padding"
    Android:textAppearance="?android:attr/textAppearanceLarge"/>

Mon "vide" hintSpinnerDropdownItem.xml qui cachera l'indice.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"/>

Je passe dans un tableau de CustomObj sans indice. C'est pourquoi j'ai la méthode AddPrompt supplémentaire pour insérer l'indicateur au début avant qu'il ne soit transmis au constructeur parent.

public class CustomArrayAdapter: ArrayAdapter<CustomObj>
{

    private const int HintPosition = 0;
    private const CustomObj HintValue = null;
    private const string Hint = "Hint";

    public CustomArrayAdapter(Context context, int textViewResourceId, CustomObj[] customObjs) : base(context, textViewResourceId, AddPrompt(customObjs))
    {


    private static CustomObj[] AddPrompt(CustomObj[] customObjs)
    {
        CustomObj[] customObjsWithHint = new CustomObj[customObjs.Length + 1];
        CustomObj[] hintPlaceholder = { HintValue };
        Array.Copy(hintPlaceholder , customObjsWithHint , 1);
        Array.Copy(customObjs, 0, customObjsWithHint , 1, customObjs.Length);
        return customObjsWithHint ;
    }

    public override Android.Views.View GetView(int position, Android.Views.View convertView, ViewGroup parent)
    {
        CustomObj customObj = GetItem(position);
        bool isHint = customObj == HintValue;

        if (convertView == null)
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
        }

        TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
        textView.Text = isHint ? Hint : customObj.Value;
        textView.SetTextColor(isHint ? Color.Gray : Color.Black);

        return convertView;

    public override Android.Views.View GetDropDownView(int position, Android.Views.View convertView, ViewGroup parent)
    {
        CustomObj customObj = GetItem(position);

        if (position == HintPosition)
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.hintSpinnerDropdownItem, parent, false);
        }
        else
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
            TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
            textView.Text = customObj.Value;
        }

        return convertView;
    }
}
0
Patrick Ma

La manière la plus simple que j'ai trouvée est la suivante: Crée un TextView ou LinearLayout et le place avec le Spinner dans un RelativeLayout. Initialement, la vue texte aura le texte comme s'il s'agissait de la suggestion "Sélectionnez-en un ...", après le premier clic, cette vue TextView est invisible, désactivée et appelle Spinner qui se trouve juste derrière.

Étape 1:

Dans le fichier activity.xml qui trouve le spinner:

 <RelativeLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content">
    <Spinner
        Android:id="@+id/sp_main"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:spinnerMode="dropdown" />
    <LinearLayout
        Android:id="@+id/ll_hint_spinner"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:gravity="center">
        <TextView

            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:gravity="center"
            Android:text="Select..."/>

    </LinearLayout>
</RelativeLayout>

Étape 2:

Dans votre type d'activité.Java:

public class MainActivity extends AppCompatActivity {

    private LinearLayout ll_hint_spinner;
    private Spinner sp_main;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ll_hint_spinner = findViewById(R.id.ll_hint_spinner);
        sp_main = findViewById(R.id.sp_main);
        //Action after clicking LinearLayout / Spinner;
        ll_hint_spinner.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //By clicking "Select ..." the Spinner is requested;
                sp_main.performClick();
                //Make LinearLayout invisible
                setLinearVisibility(false);
                //Disable LinearLayout
                ll_hint_spinner.setEnabled(false);
                //After LinearLayout is off, Spinner will function normally;
                sp_main.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        sp_main.setSelection(position);
                    }
                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        setLinearVisibility(true);
                    }
                });
            }
        });
    }
    //Method to make LinearLayout invisible or visible;
    public void setLinearVisibility(boolean visible) {
        if (visible) {
            ll_hint_spinner.setVisibility(View.VISIBLE);
        } else {
            ll_hint_spinner.setVisibility(View.INVISIBLE);
        }
    }
}

Exemple1SameExample2SameExample3

Les exemples d'images, j'ai utilisé un Spinner personnalisé, mais le résultat du dernier exemple sera le même.

Note: J'ai l'exemple dans github: https://github.com/MurilloComino/Spinner_hint

0
Murillo Comino

Ce qui a fonctionné pour moi, c’est que vous alliez configurer votre liste de pièces avec une liste d’articles comprenant l’allusion du début.

    final MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spinner);

    spinner.setItems("Select something in this list", getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));

Désormais, lorsque l'utilisateur sélectionne réellement un élément de la liste, vous devez utiliser la méthode spinner.setItems pour définir la liste sur tout ce qui est indiqué en plus de votre indice:

       spinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {

            @Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
                spinner.setItems(getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));

}

L'indice sera supprimé dès que l'utilisateur aura sélectionné quelque chose dans la liste.

0
Simon