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>
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.
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!
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)
É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 ..
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) {
}
});
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...");
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;
}
}
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
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.