it-swarm.com.ru

Как добавить подсказку в спиннер в XML

Я пытаюсь добавить подсказку в виджет счетчика, поскольку здесь нет опции подсказки, как в 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 Массив счетчика

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

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

@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

34
Dotnetpickles

Есть два способа использования блесны:

статический способ

Android:spinnerMode="dialog"

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

Android:Prompt="@string/hint_resource"

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

spinner.setPrompt("Gender");

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

Пусть это поможет!

9
Saurabh Vardani

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

<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-макет для вращающегося 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
Rajesh Ravindradas

Шаг 1:

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

Например: private String [] yourArray = new String [] {"Staff", "Student", "Your Hint"};

Шаг 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 Из этого ответа - https://stackoverflow.com/a/22774285/3879847

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

3
Ranjith Kumar

Хитрость в этой линии

((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) {
            }
        });
2
David Rearte

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

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 () method или что , заставит Spinner выбрать подсказку 

yourSpinner.setSelection(2);
1

Вы можете установить Spinner Prompt:

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

Мне удалось добавить подсказку, которая пропущена из выпадающего списка. Если мой код выглядит немного странно, то это потому, что я использую Xamarin.Android, поэтому он находится в C #, но для всех целей (хех) и целей эквивалент 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;
    }
}
0
Patrick Ma

Простейший способ, который я нашел, был следующим: Создает 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);
        }
    }
}

Пример1SameExample2SameExample3

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

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

0
Murillo Comino

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

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

}

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

0
Simon