Как добавить подсказку в 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"