Как добавить подсказку в spinner в XML

Я пытаюсь добавить подсказку в виджет spinner, так как нет опции подсказки, как в EditText, я хочу показать "Пол" как подсказку, и при нажатии на нее должен отображаться только "Мужчина и женщина", а не подсказка.

Как это можно сделать только с использованием XML

XML-код счетчика.

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

Строка Массив счетчика

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

Ответ 1

В адаптере вы можете установить первый элемент как отключенный. Ниже приведен пример кода

@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;
    }
}

И установите первый элемент в серый цвет.

@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;
}

И если пользователь выбирает первый элемент, ничего не делайте.

@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();
    }
}

Подробнее см. Ниже.

Как добавить подсказку к Spinner в Android

Ответ 2

Существует два способа использования счетчика:

статический путь

android:spinnerMode="dialog"

и затем установите:

android:prompt="@string/hint_resource"

динамический путь

spinner.setPrompt("Gender");

Примечание. Он будет работать как подсказка, но на самом деле это не так.

Помогите!

Ответ 3

Это можно сделать очень просто. Вместо того, чтобы устанавливать адаптер с использованием встроенных значений (android.R.layout.simple_list_item_1), создайте свой собственный XML-макет как для TextView, так и для DropDown и используйте их. В макете TextView определите текст подсказки и цвет подсказки. Последний шаг: создать и удалить элемент в качестве первого элемента в массиве элементов, определенном в Строках.

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

Создайте XML-макет для 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" />

Создайте XML-макет для 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"/>

Определить счетчик в основном XML-макете

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

И, наконец, в коде, устанавливая адаптер для счетчика, используйте свой собственный XML-макет.

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

Шаг 1:

Ваш массив выглядит. последний пункт вашего намека

Пример: private String [] yourArray = new String [] {"Персонал", "Студент", "Ваш намек"};

Шаг 2:

Создайте HintAdpater.java (просто скопируйте и вставьте)

Этот класс не возвращает последний элемент. Таким образом, ваш подсказка не отображается.

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

Шаг 3:

Установите такой адаптер

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

Кредит отправляется @Yakiv Mospan из этого ответа - fooobar.com/questions/15547/...

Я изменяю только некоторые изменения.

Ответ 5

Трюк - это линия

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

используйте его в onItemSelected. Вот мой код с большим контекстом

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) {
            }
        });

Ответ 6

сделайте свой намек на конечную позицию в вашем массиве строк, как этот Город - это подсказка здесь

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

а затем в вашем адаптере массива

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

поэтому адаптер возвращает только первые два элемента и, наконец, в метод onCreate() или что ,, заставляет Spinner выбрать подсказку

yourSpinner.setSelection(2);

Ответ 7

Самый простой способ, который я нашел, был таким: Создает TextView или LinearLayout и помещает его вместе с Spinner в RelativeLayout. Первоначально текстовое представление будет иметь текст, как если бы это была подсказка "Выберите один...", после первого щелчка этот TextView невидим, отключен и вызывает Spinner, который находится прямо за ним.

Шаг 1:

В файле activity.xml, который находит счетчик, вставьте:

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

Шаг 2:

В вашем Activity.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);
        }
    }
}

Example1 SameExample2 SameExample3

В примерах изображений я использовал пользовательский Spinner, но результат последнего примера будет таким же.

Примечание: у меня есть пример в github: https://github.com/MurilloComino/android-spinner-hint

Ответ 8

То, что сработало для меня, - это то, что вы создали свой счетчик со списком предметов, включая подсказку в начале.

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

Теперь, когда пользователь на самом деле выбирает что-то в списке, вы должны использовать метод spinner.setItems, чтобы установить список во все, кроме вашего намека:

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

}

Подсказка будет удалена, как только пользователь выберет что-то в списке.

Ответ 9

Мне удалось добавить подсказку, которая пропущена из выпадающего списка. Если мой код выглядит немного странно, потому что я использую Xamarin.Android, так и в С#, но для всех целей (хех) и целей эквивалент Java должен иметь такой же эффект.

Суть в том, что я создал собственный ArrayAdapter, который обнаружит подсказку в методе GetDropDownView. Если это так, то он будет раздувать пустой XML, чтобы скрыть подсказку от выпадающего списка.

Мой spinnerItem.xml - это...

<?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"/>

Мой "пустой" hintSpinnerDropdownItem.xml, который будет скрывать подсказку.

<?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"/>

Я передаю в массиве CustomObj без подсказки. Вот почему у меня есть дополнительный метод AddPrompt для вставки подсказки в начале, прежде чем он передается в родительский конструктор.

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

Ответ 10

если ваш Spinner не поддерживает андроид: prompt, вместо этого следует использовать android.support.v7.widget.AppCompatSpinner.

<android.support.v7.widget.AppCompatSpinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:prompt="Gender" />

Ответ 11

Вы можете установить подсказку спиннера:

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

Ответ 12

Попробуйте использовать следующее свойство:

android:prompt="Gender"