如何在 Android 中自定义 Spinner

我想给 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" />

但似乎没什么效果。

470192 次浏览

为您的微调器创建具有自定义布局的自定义适配器。

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);

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" />

Simple _ spinner _ drop _ 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>

到目前为止,我找到的最优雅、最灵活的解决方案是这样的: Http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html

基本上,遵循以下步骤:

  1. 为您的下拉项创建自定义布局 xml 文件,假设我将它命名为 spinner _ item. xml
  2. 为您的下拉适配器创建自定义视图类。在这个自定义类中,需要在 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;
    }
    
    
    }
    
  3. In your activity or fragment, make use of the custom adapter for your spinner view. Something like this:

    Spinner sp = (Spinner)findViewById(R.id.spMySpinner);
    ArrayAdapter<String> myAdapter = new CustomArrayAdapter(this, R.layout.spinner_item, options);
    sp.setAdapter(myAdapter);
    

where options is the list of dropdown item string.

这对我很有效:

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" />

您可以创建完全自定义的微调器设计,如

Step1: 在可绘制文件夹中,为 spinner 的边框创建 backound.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 enter image description here

 <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>

最后看起来像下面的图片,它是到处都可以在圆形区域点击,不需要写单击图片查看列表。

enter image description here

第三步: 对于下拉设计,从下拉列表视图中删除该行并更改背景颜色, 创建自定义适配器,如

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 _ drop down. 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>

终于看起来像是

enter image description here

根据需要,可以通过改变 simple _ spinner _ drop 的背景颜色或文本颜色来改变下拉颜色的背景颜色和文本颜色。Xml

试试这个

我在尝试其他解决方案时遇到了很多问题... ... 经过大量的研发,现在我有了解决方案

  1. 在布局文件夹中创建 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>
    
  2. 在你的活动中

    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));
    
  3. 创建一个新的适配器类

    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;
    }
    }
    

我已经建立了一个小的演示项目,你可以看看它 链接到项目