Я хочу добавить настраиваемую высоту в раскрывающийся список 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" />
Но вроде ничего не работает.
Ответы:
Создайте собственный адаптер с настраиваемым макетом для вашего счетчика.
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>
источник
<item name="android:height">
на<item name="android:layout_height">
android:id="@+android:id/text1"
в файле simple_spinner_dropdown_item.xml не надо ?Вы можете создать полностью индивидуальный дизайн спиннера, например, как
Шаг 1: В папке с возможностью переноса создайте background.xml для границы прядильщика.
<?xml version="1.0" encoding="utf-8"?> <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" /> </shape>
Шаг 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.
источник
Самое элегантное и гибкое решение, которое я нашел до сих пор, находится здесь: http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html
Как правило, выполните следующие действия:
Создайте собственный класс представления для вашего раскрывающегося адаптера. В этом настраиваемом классе вам необходимо перезаписать и установить собственный макет выпадающего списка в методах 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);
где параметры - это список строк раскрывающегося списка.
источник
Попробуй это
У меня было много проблем, когда я пробовал другое решение ... После большого количества исследований и разработок теперь у меня есть решение
создайте 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 SpinnerAdapter(this, R.layout.custom_spinner, years));
создать новый класс адаптера
public class SpinnerAdapter extends ArrayAdapter<String> { private 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, @NonNull ViewGroup parent) { return getCustomView(position, convertView, parent); } @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { return getCustomView(position, convertView, parent); } private View getCustomView(final int position, View convertView, ViewGroup parent) { View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_spinner, parent, false); final TextView label=(TextView)row.findViewById(R.id.tv_spinnervalue); label.setText(objects[position]); return row; } }
источник
Это сработало для меня:
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" />
источник
Я создал небольшой демонстрационный проект на этом, вы можете посмотреть на него Ссылка на проект
источник