Изменить значок выпадающего списка Spinner
Решения, которые я нашел, чтобы изменить значок выпадающего списка spinner, где все:
1. создать настраиваемый
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/vector_drawable_ic_dropdown_black" android:state_focused="true" android:state_pressed="false" />
<item android:drawable="@drawable/vector_drawable_ic_dropdown_black" android:state_focused="true" android:state_pressed="true" />
<item android:drawable="@drawable/vector_drawable_ic_dropdown_black" android:state_focused="false" android:state_pressed="true" />
<item android:drawable="@drawable/vector_drawable_ic_dropdown_black" />
</selector>
2. Установите для рисования в качестве фона счетчика:
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="@drawable/custom_spinner_icon"
android:gravity="center"
android:paddingBottom="8dp"
android:paddingTop="8dp"
android:textColor="@color/textcolorprimary" />
И результат:
![введите описание изображения здесь]()
Как вы можете видеть, это не приемлемое решение, так как значок должен быть выровнен по правому краю и не растянут.
Что я могу сделать, чтобы значок не растягивался и не выравнивал его?
ИЗМЕНИТЬ
Поскольку никаких рабочих решений пока нет, думаю, я должен указать свой вопрос.
Вот как выглядит мой Spinner с помощью стандартной темы:
<Spinner
android:id="@+id/products_download_spinner_language"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:gravity="center"
android:paddingBottom="8dp"
android:paddingTop="8dp"
android:textColor="@color/textcolorprimary"
android:theme="@android:style/Theme.Holo.Light.DarkActionBar" />
![введите описание изображения здесь]()
И все, что я хочу (на самом деле это не так много, я думаю) меняет стрелку. я не хочу, чтобы стрелка в правом нижнем углу отображалась, я хочу, чтобы эта стрелка отображалась вертикально по центру справа:
![введите описание изображения здесь]()
И каждое решение, которое я пробовал до сих пор:
Spinner Dropdown Arrow
Как установить стрелку вниз в spinner?
просто не работает. У них были растянутые значки, или нижняя строка отсутствовала, или что-то еще было совершенно неправильным. Я просто хочу другую стрелу.
Ответы
Ответ 1
Попробуйте применить следующий стиль к вашему счетчику, используя
style="@style/SpinnerTheme"
// Стиль Spinner:
<style name="SpinnerTheme" parent="android:Widget.Spinner">
<item name="android:background">@drawable/bg_spinner</item>
</style>
// bg_spinner.xmlЗамените arrow_down_gray стрелкой
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item>
<shape>
<gradient android:angle="90" android:endColor="#ffffff" android:startColor="#ffffff" android:type="linear" />
<stroke android:width="0.33dp" android:color="#0fb1fa" />
<corners android:radius="0dp" />
<padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" />
</shape>
</item>
<item android:right="5dp">
<bitmap android:gravity="center_vertical|right" android:src="@drawable/arrow_down_gray" />
</item>
</layer-list>
</item>
</selector>
Ответ 2
Для этого вы можете использовать .9 Patch Image и просто установите его в фоновом режиме.
android:background="@drawable/spin"
Здесь я дам вам изображение .9patch. попробуйте с этим.
![введите описание изображения здесь]()
Щелкните правой кнопкой мыши по изображению и нажмите Сохранить изображение как
установите имя изображения следующим образом: anyname.9.png и нажмите save.
Наслаждайтесь.. Happy Coading.:)
Ответ 3
Добавить тему в спиннер
<Spinner style="@style/SpinnerTheme"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Добавить spinnerTheme в styles.xml
<style name="SpinnerTheme" parent="android:Widget.Spinner">
<item name="android:background">@drawable/spinner_background</item>
</style>
Добавьте New → "Векторный актив" к рисуемым, например, с помощью "ic_keyboard_arrow_down_24dp"
Добавить spinner_background.xml в drawable
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item android:drawable="@drawable/ic_keyboard_arrow_down_24dp" android:gravity="center_vertical|right" android:right="5dp"/>
</layer-list>
</item>
</selector>
Ответ 4
Вам нужно создать настраиваемый фон следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item>
<shape>
<gradient android:angle="90" android:endColor="#ffffff" android:startColor="#ffffff" android:type="linear"/>
<stroke android:width="1dp" android:color="#504a4b"/>
<corners android:radius="5dp"/>
<padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp"/>
</shape>
</item>
<item>
<bitmap android:gravity="bottom|right" android:src="@drawable/drop_down"/> // you can place your dropdown image
</item>
</layer-list>
</item>
</selector>
Затем создайте стиль для spinner следующим образом:
<style name="spinner_style">
<item name="android:background">@drawable/YOURCUSTOMBACKGROUND</item>
<item name="android:layout_marginLeft">5dp</item>
<item name="android:layout_marginRight">5dp</item>
<item name="android:layout_marginBottom">5dp</item>
</style>
после этого примените этот стиль к spinner
Ответ 5
Вы пытались определить пользовательский фон в XML? уменьшая ширину фона Spinner, которая делает вашу стрелку похожей на это.
Определите список слоев с прямоугольным фоном и вашим собственным значком стрелки:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/color_white" />
<corners android:radius="2.5dp" />
</shape>
</item>
<item android:right="64dp">
<bitmap android:gravity="right|center_vertical"
android:src="@drawable/custom_spinner_icon">
</bitmap>
</item>
</layer-list>
Ответ 6
Без использования ЛЮБОЙ снимок с помощью ИК-выпадающего меню
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item>
<shape>
<gradient android:angle="90" android:endColor="#ffffff" android:startColor="#ffffff" android:type="linear" /><!--For gradient background-->
<stroke android:width="1dp" android:color="#FFF" /><!--For Border background-->
<corners android:radius="0dp" /><!--For background corner-->
<padding android:bottom="3dp" android:left="3dp" android:right="6dp" android:top="3dp" /><!--For padding for all sides-->
</shape>
</item>
<item>
<bitmap android:gravity="center|right" android:src="@drawable/ic_down_arrow" /> // Replace with your Icon
</item>
</layer-list>
</item>
Ответ 7
dummy.xml(помните, что размер изображения должен быть меньше)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list android:opacity="transparent">
<item android:width="60dp" android:gravity="left" android:start="20dp">
<bitmap android:src="@drawable/down_button_dummy_dummy" android:gravity="left"/>
</item>
</layer-list>
</item>
</selector>
фрагмент файла макета похож на
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardUseCompatPadding="true"
app:cardElevation="5dp"
>
<Spinner
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@drawable/dummy">
</Spinner>
</android.support.v7.widget.CardView>
нажмите, чтобы увидеть изображение макета результата
Ответ 8
У меня было много трудностей с этим, так как у меня есть пользовательский спиннер, если я установил Background, то Drawable растянется. Мое решение для этого было добавить в правой части Spinner TextView. Вот фрагмент кода из моего Custom Spinner. Хитрость заключается в том, чтобы переопределить getView и настроить Textview, как вы хотите.
public class NoTextSpinnerArrayAdapter extends ArrayAdapter<String> {
private String text = "0";
public NoTextSpinnerArrayAdapter(Context context, int textViewResourceId, List<String> objects) {
super(context, textViewResourceId, objects);
}
public void updateText(String text){
this.text = text;
notifyDataSetChanged();
}
public String getText(){
return text;
}
@NonNull
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView textView = view.findViewById(android.R.id.text1);
textView.setCompoundDrawablePadding(16);
textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_menu_white_24dp, 0);
textView.setGravity(Gravity.END);
textView.setText(text);
return view;
}
}
Вам также нужно установить прозрачный фон Spinner:
<lifeunlocked.valueinvestingcheatsheet.views.SelectAgainSpinner
android:id="@+id/saved_tickers_spinner"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="248dp"
tools:layout_editor_absoluteY="16dp" />
а мой кастом прядильщик если хочешь....
public class SelectAgainSpinner extends android.support.v7.widget.AppCompatSpinner {
public SelectAgainSpinner(Context context) {
super(context);
}
public SelectAgainSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SelectAgainSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setPopupBackgroundDrawable(Drawable background) {
super.setPopupBackgroundDrawable(background);
}
@Override
public void setSelection(int position, boolean animate) {
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position, animate);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
if (getOnItemSelectedListener() != null) {
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
}
@Override
public void setSelection(int position) {
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
if (getOnItemSelectedListener() != null) {
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
}
}
Ответ 9
Мы можем управлять этим, скрывая иконку, как я сделал:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Spinner android:id="@+id/fragment_filter_sp_users"
android:layout_width="match_parent"
android:background="@color/colorTransparent"
android:layout_height="wrap_content"/>
<ImageView
android:layout_gravity="end|bottom"
android:contentDescription="@null"
android:layout_marginBottom="@dimen/_5sdp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_arrow_bottom"
/>
</FrameLayout>