如何在 Android 中自定义 Spinner
Posted
技术标签:
【中文标题】如何在 Android 中自定义 Spinner【英文标题】:How to customize a Spinner in Android 【发布时间】:2013-05-17 16:23:36 【问题描述】:我想在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_
android:layout_
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" />
但似乎没有任何效果。
【问题讨论】:
stephenpengilley.blogspot.com/2013/01/…custom-android-dn.blogspot.com/2012/12/… 没有应用样式? popupBackGround 还是别的什么?奇怪。 @Houcine : 我已经尝试过这些例子 .. 我想调整下拉列表的高度 @shree202 : 没有样式适用 @ComeIn ,这不是Android风格,而是他创建的自定义风格。这就是为什么他只有“style=" 【参考方案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_
android:layout_
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_
android:layout_
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">
感谢您的回复.. 尝试但没有效果...在过去 3-4 天打开/关闭它.. 现在很烦:(
@Tarun,你不需要 simple_spinner_dropdown_item.xml 文件中的android:id="@+android:id/text1"
吗?
在 R.layout.simple_spinner_dropdown_item 中,将 android:layout_height 的值改为 "?attr/dropdownListPreferredItemHeight" 否则会报错:"Error: Attribute is not public"
对于此答案的未来访问者:不要将 TextView 和 CheckedTextview 包装在布局中。将其直接发布到您的 layout_file.xml 文件中。我被困在这里几个小时,直到我发现错误所在。【参考方案2】:
您可以创建完全自定义的微调器设计,如 as
Step1:在drawable文件夹中制作background.xml作为spinner的边框。
<?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:
android:color="@android:color/darker_gray" />
</shape>
Step2:对于微调器的布局设计,请使用此下拉图标或任何图像 drop.png
<RelativeLayout
android:layout_
android:layout_
android:layout_marginRight="3dp"
android:layout_weight=".28"
android:background="@drawable/spinner_border"
android:orientation="horizontal">
<Spinner
android:id="@+id/spinner2"
android:layout_
android:layout_
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_
android:layout_
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:src="@mipmap/drop" />
</RelativeLayout>
最终如下图所示,圆形区域随处可点击,无需为imageView编写click Lister。
Step3:对于下拉设计,从Dropdown ListView中移除线条并更改背景颜色, 创建自定义适配器,如 as
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_
android:layout_
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_
android:layout_
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的背景颜色或者文字颜色来改变下拉颜色的背景颜色和文字
【讨论】:
在第一个代码中你是说第 6 行中的 android: 吗? 误写了两次 android:width = "1dp" 没问题,我只是不想自己编辑它,因为我不确定您是想用“1dp”指定高度还是只是重复。虽然很好的答案。 :) @BineshKumar 嘿,我可以知道你在哪里声明了 CheckedTextView 吗?因为当我粘贴代码时,它告诉我必须先声明元素 伙计,你本可以在布局和可绘制对象中使用名称,我已经花了半个小时,仍然不知道该怎么做。错误答案的减号。【参考方案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 是下拉项字符串的列表。
【讨论】:
对我来说诀窍是重写 getDropDownView,我正在重写 getView,但没有意识到我必须重写那个方法。【参考方案4】:试试这个
我在尝试其他解决方案时遇到了很多问题......经过大量研发现在我得到了解决方案
在布局文件夹中创建 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_
android:layout_
android:background="@color/colorGray">
<TextView
android:id="@+id/tv_spinnervalue"
android:layout_
android:layout_
android:textColor="@color/colorWhite"
android:gravity="center"
android:layout_alignParentLeft="true"
android:textSize="@dimen/_18dp"
android:layout_marginTop="@dimen/_3dp"/>
<ImageView
android:layout_
android:layout_
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;
【讨论】:
点击微调器后,这给了我所有项目上的 men_icon 图像,这不是我想要的。如果您不希望 men_icon 图像(或其他自定义项)在单击微调器后出现在所有行上,请删除“getDropDownView”覆盖。【参考方案5】:这对我有用:
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_
// add custom fields here
android:layout_
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" />
【讨论】:
【参考方案6】:我已经建立了一个小型演示项目,你可以看看它 Link to project
【讨论】:
以上是关于如何在 Android 中自定义 Spinner的主要内容,如果未能解决你的问题,请参考以下文章