如何在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" /> 

但似乎没有任何工作。

使用自定义布局创build一个自定义适配器。

 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> 

您可以像创build完全自定义的微调器devise

第一步:在drawable文件夹中为spinner的边框创buildbackground.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"` /> 

第二步:为微调器的版面devise使用这个下拉图标或任何图像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> 

最后看起来像下面的图像,它是在圆形区域中可点击的每一处,而不需要为imageView编写点击列表。

在这里输入图像说明

第3步:对于下拉devise,从下拉列表中删除线,并改变回地面的颜色,创build自定义的适配器,如

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

在可绘制文件夹中创buildR.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" /> 

在drawable文件夹中创buildsimple_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> 

Finnally看起来像

在这里输入图像说明

根据需要,您可以通过更改simple_spinner_dropdown.xml的背景颜色或文本颜色来更改下拉颜色的背景颜色和文本

目前为止,我发现的最优雅和灵活的解决scheme是: http : //android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html

基本上,请按照下列步骤操作:

  1. 为您的下拉菜单项创build自定义的布局xml文件,假设我将其称为spinner_item.xml
  2. 为您的下拉适配器创build自定义视图类。 在这个自定义类中,您需要覆盖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. 在您的活动或片段中,使用您的微调视图的自定义适配器。 像这样的东西:

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

其中选项是下拉项目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); 

并在我的布局文件夹中创buildsimple_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" /> 

尝试这个

当我尝试其他解决scheme时,我遇到了很多问题……经过大量的研发工作,现在我得到了解决scheme

  1. 在布局文件夹中创buildcustom_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(newAddListingDetails.SpinnerAdapter(Activityname.this, R.layout.custom_spinner, years)); //spinner.setAdapter(new FragmentShopbycategoryColor.SpinnerAdapter(getActivity(), R.layout.custom_spinner, years)); //if you r using fragment 
  3. 在同一活动中创build一个方法

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