Как настроить Spinner в Android
Я хочу добавить пользовательскую высоту в раскрывающийся список Spinner
, скажем, 30dp, и я хочу скрыть разделители выпадающего списка Spinner
.
До сих пор я пытался реализовать следующий стиль для Spinner
:
<style name="spinner_style">
<item name="android:paddingLeft">0dp</item>
<item name="android:dropDownWidth">533dp</item>
<item name="android:showDividers">none</item>
<item name="android:dividerHeight">0dp</item>
<item name="android:popupBackground">@drawable/new_bg</item>
<item name="android:dropDownHeight">70dp</item>
<item name="android:scrollbarAlwaysDrawVerticalTrack">true</item>
<item name="android:dropDownSelector">@android:color/white</item>
</style>
и код моего счетчика:
<Spinner
android:id="@+id/pioedittxt5"
android:layout_width="543dp"
android:layout_height="63dp"
android:layout_toRightOf="@+id/piotxt5"
android:background="@drawable/spinner"
style="@style/spinner_style"
android:dropDownVerticalOffset="-53dp"
android:spinnerMode="dropdown"
android:drawSelectorOnTop="true"
android:entries="@array/travelreasons"
android:prompt="@string/prompt" />
Но ничего не работает.
Ответы
Ответ 1
Создайте пользовательский адаптер с настраиваемым макетом для вашего счетчика.
Spinner spinner = (Spinner) findViewById(R.id.pioedittxt5);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.travelreasons, R.layout.simple_spinner_item);
adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
R.layout.simple_spinner_item
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="@style/spinnerItemStyle"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee" />
R.layout.simple_spinner_dropdown_item
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="@style/spinnerDropDownItemStyle"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="?android:attr/dropdownListPreferredItemHeight"
android:ellipsize="marquee" />
В стилях добавьте свои собственные размеры и высоту согласно вашему требованию.
<style name="spinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">
</style>
<style name="spinnerDropDownItemStyle" parent="android:TextAppearance.Widget.TextView.SpinnerItem">
</style>
Ответ 2
Вы можете создать полностью настраиваемый дизайн spinner, например
Шаг1: В папке с возможностью рисования сделайте background.xml для рамки счетчика.
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/transparent" />
<corners android:radius="5dp" />
<stroke
android:width="1dp"
android:color="@android:color/darker_gray"` />
Шаг 2: для дизайна макета счетчика используйте этот значок со снижением или любое изображение drop.png
![введите описание изображения здесь]()
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="3dp"
android:layout_weight=".28"
android:background="@drawable/spinner_border"
android:orientation="horizontal">
<Spinner
android:id="@+id/spinner2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:background="@android:color/transparent"
android:gravity="center"
android:layout_marginLeft="5dp"
android:spinnerMode="dropdown" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:src="@mipmap/drop" />
</RelativeLayout>
Наконец, выглядит как изображение ниже, и каждый из них можно щелкнуть в круглой области и не нужно писать Lister для ImageView.
![введите описание изображения здесь]()
Шаг 3. Для раскрывающегося дизайна удалите строку из раскрывающегося списка ListView и измените цвет фона,
Создайте пользовательский адаптер, например
Spinner spinner = (Spinner) findViewById(R.id.spinner1);
String[] years = {"1996","1997","1998","1998"};
ArrayAdapter<CharSequence> langAdapter = new ArrayAdapter<CharSequence>(getActivity(), R.layout.spinner_text, years );
langAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown);
mSpinner5.setAdapter(langAdapter);
В выделенной папке создайте R.layout.spinner_text.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layoutDirection="ltr"
android:id="@android:id/text1"
style="@style/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:paddingLeft="2dp"
/>
В выделенной папке создайте simple_spinner_dropdown.xml
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="@style/spinnerDropDownItemStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"
android:singleLine="true" />
В стилях вы можете добавлять собственные размеры и высоту согласно вашему требованию.
<style name="spinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">
</style>
<style name="spinnerDropDownItemStyle" parent="android:TextAppearance.Widget.TextView.SpinnerItem">
</style>
Формально выглядит как
![введите описание изображения здесь]()
В соответствии с требованием вы можете изменить цвет фона и текст выпадающего цвета, изменив цвет фона или цвет текста simple_spinner_dropdown.xml
Ответ 3
Самое элегантное и гибкое решение, которое я нашел до сих пор, находится здесь:
http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html
В основном выполните следующие действия:
- Создайте собственный XML файл макета для вашего выпадающего элемента, допустим, я назову его spinner_item.xml
-
Создайте собственный класс представления для вашего выпадающего адаптера. В этом настраиваемом классе вам необходимо перезаписать и установить свой собственный шаблон раскрывающегося списка в методах getView() и getDropdownView(). Мой код выглядит следующим образом:
public class CustomArrayAdapter extends ArrayAdapter<String>{
private List<String> objects;
private Context context;
public CustomArrayAdapter(Context context, int resourceId,
List<String> objects) {
super(context, resourceId, objects);
this.objects = objects;
this.context = context;
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=(LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View row=inflater.inflate(R.layout.spinner_item, parent, false);
TextView label=(TextView)row.findViewById(R.id.spItem);
label.setText(objects.get(position));
if (position == 0) {//Special style for dropdown header
label.setTextColor(context.getResources().getColor(R.color.text_hint_color));
}
return row;
}
}
-
В своей деятельности или фрагменте используйте пользовательский адаптер для просмотра спиннера. Что-то вроде этого:
Spinner sp = (Spinner)findViewById(R.id.spMySpinner);
ArrayAdapter<String> myAdapter = new CustomArrayAdapter(this, R.layout.spinner_item, options);
sp.setAdapter(myAdapter);
где options - это список строк выпадающего списка.
Ответ 4
Это сработало для меня:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),R.layout.simple_spinner_item,areas);
Spinner areasSpinner = (Spinner) view.findViewById(R.id.area_spinner);
areasSpinner.setAdapter(adapter);
и в моей папке макета я создал simple_spinner_item
:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
// add custom fields here
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingRight="?android:attr/listPreferredItemPaddingRight" />
Ответ 5
Попробуйте
У меня было много проблем, когда я пытался найти другое решение... После много R & D теперь я получил решение
-
создать custom_spinner.xml в папке макета и вставить этот код
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorGray">
<TextView
android:id="@+id/tv_spinnervalue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorWhite"
android:gravity="center"
android:layout_alignParentLeft="true"
android:textSize="@dimen/_18dp"
android:layout_marginTop="@dimen/_3dp"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@drawable/men_icon"/>
</RelativeLayout>
-
в вашей деятельности
Spinner spinner =(Spinner)view.findViewById(R.id.sp_colorpalates);
String[] years = {"1996","1997","1998","1998"};
spinner.setAdapter(new AddListingDetailsActivity.SpinnerAdapter(Activityname.this, R.layout.custom_spinner, years));
//spinner.setAdapter(new FragmentShopbycategoryColor.SpinnerAdapter(getActivity(), R.layout.custom_spinner, years)); //if you r using fragment
-
создать метод для вашей же деятельности
public class SpinnerAdapter extends ArrayAdapter<String>
{
String[] objects;
public SpinnerAdapter(Context context, int textViewResourceId, String[] objects)
{
super(context, textViewResourceId, objects);
this.objects=objects;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(final int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater=getLayoutInflater();
//LayoutInflater inflater=getActivity.getLayoutInflater();//for fragment
View row=inflater.inflate(R.layout.custom_spinner, parent, false);
final TextView label=(TextView)row.findViewById(R.id.tv_spinnervalue);
label.setText(objects[position]);
return row;
}
}