如何在Android中自定义微调框


140

我想在a的下拉菜单中添加自定义高度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" />

但是似乎没有任何作用。



没有应用任何样式?popupBackGround还是其他?奇怪。
Chintan Soni

@Houcine:我已经尝试过这些示例了..我想调整下拉列表的高度
Shruti

@ shree202:没有风格应用
思鲁提

1
@ComeIn,这不是Android样式,而是他创建的自定义样式。这就是为什么他只有“ style =”
Cyber​​Claw

Answers:


194

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

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>

3
尝试更改<item name="android:height"><item name="android:layout_height">
Tarun

1
thanx的回复..尝试了但没有任何效果...持续3-4天对其进行操作..只是
有点

5
@Tarun,您是否不需要simple_spinner_dropdown_item.xml android:id="@+android:id/text1"文件?
batbrat 2014年

1
在R.layout.simple_spinner_dropdown_item中,将android:layout_height值更改为“?attr / dropdownListPreferredItemHeight”,否则会出现错误:“错误:属性不公开”
Loenix,2016年

9
对于将来获得此答案的访问者不要将TextView和CheckedTextview包装在布局中。将其直接发布到您的layout_file.xml文件中。我被困在这里几个小时,直到发现错误所在。
弗朗西斯科·罗梅罗

95

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

步骤1:在drawable文件夹中,将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>

最终看起来像下面的图像,它在圆形区域中到处都是可单击的,无需为imageView编写click Lister。

在此处输入图片说明

步骤3:对于下拉式设计,请从Dropdown 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的背景颜色或文本颜色来更改背景颜色和下拉颜色的文本


在第一个代码片段中,您是说第6行中的android:height =“ 1dp”吗?
威利·曼策尔

错误两次写入android:width =“ 1dp”
Binesh Kumar

2
没问题,我只是不想自己编辑它,因为我不确定,是否要使用“ 1dp”指定高度,还是只是重复。很好的答案。:)
Willi Mentzel

@BineshKumar嘿,我可以知道您在哪里声明CheckedTextView吗?因为当我粘贴代码时,它告诉我必须首先声明该元素
hyperfkcb

2
伙计,您本可以在布局和绘图中使用名称,但我花了半个小时仍不知道该怎么做。减去错误答案。
安东·基泽玛

21

到目前为止,我发现的最优雅,最灵活的解决方案是在这里: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. 在您的活动或片段中,为旋转器视图使用自定义适配器。像这样:

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

其中options是下拉项目字符串的列表。


对我来说,技巧是覆盖getDropDownView,覆盖getView,但没有意识到我必须覆盖该方法。
estebanuri

7

试试这个

当我尝试其他解决方案时,我面临很多问题……经过大量的研发,现在我得到了解决方案

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

单击微调器后,这给了我所有项目的men_icon图片,这不是我想要的。如果您不希望在单击微调器之后,men_icon图像(或其他自定义)出现在所有行上,请删除“ getDropDownView”替代。
Brettins

2

这为我工作:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.