2013-05-22 4 views
95

Я хочу добавить пользовательскую высоту в раскрывающийся список Spinner, скажем 30dp, и я хочу скрыть разделители выпадающего списка из Spinner.Как настроить Spinner в Android

До сих пор я пытался реализовать следующий стиль к 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" /> 

Но ничего, кажется, работает.

+1

http://stephenpengilley.blogspot.com/2013/01/android-custom-spinner-tutorial.html http://custom-android-dn.blogspot.com/2012/12/how-to-use -and-custom-spinner-control.html – Houcine

+0

Ни один стиль не применяется? popupBackGround или что-нибудь еще? Странный. –

+0

@Houcine: я уже пробовал эти примеры .. Я хочу настроить высоту выпадающего списка – Shruti

ответ

142

Создайте пользовательский адаптер с настраиваемой компоновкой для вашего счетчика.

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

Я пробовал использовать предложенные варианты стилей. Но это не работает для меня! Я добавил: ' 40sp 15sp' между тегом 'spinnerItemStyle', но бесполезным. Не могли бы вы помочь мне, поскольку размер прядильщика по умолчанию слишком мал! – 7bluephoenix

+3

Попробуйте изменить '' to '' – Tarun

+1

thanx для ответа .. попытался, но не имеет никакого эффекта ... работая над этим вкл/выкл для последнего 3-4 дня. Просто раздражаюсь сейчас :( – 7bluephoenix

15

Самый элегантный и гибкое решение, я нашел до сих пор находится здесь: 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); 
    

где опция является список строки выпадающего пункта.

+0

отлично работает –

+0

Трюк для меня был переопределяющим getDropDownView, я переопределял getView, но не понял, что мне пришлось переопределить этот метод. – estebanuri

1

Это работает для меня:

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

Вы можете создать полностью пользовательских спиннера дизайн, как в

Шаг1: В вытяжке папке сделайте 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: для компоновки спиннера используйте этот значок с выпадающим значком или любое падение изображения.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> 

Наконец выглядит, как показано ниже изображения, и это, где каждый кликабельны в круглой области, и нет необходимости писать для ImageView нажмите Lister.

enter image description here

Шаг 3: Для выпадающего дизайна, удалить строку из раскрывающегося списка 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> 

Finnally выглядит, как

enter image description here

По требованию вы можете изменить цвет фона и текста ниспадающем цвет, изменяя цвет фона или цвет текста simple_spinner_dropdown.xml

+0

в первом коде, отрезаемом, вы имеете в виду андроид: height = "1dp" в строке 6? –

+0

По ошибке два раза написать андроид: width = "1dp" –

+2

Нет проблем, я просто не хотел его редактировать самостоятельно, потому что я не был уверен, если вы хотите указать высоту с помощью «1dp» или если это просто дублировать. Хороший ответ. :) –

1

Try это

У меня было много проблем, когда я пытался найти другое решение ... После серии R & D теперь я получил решение

  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 AddListingDetailsActivity.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. создать метод для той же деятельности

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

Это дало мне изображение men_icon на всех элементах после нажатия на счетчик, который не был тем, что я искал. Если вы не хотите, чтобы изображение men_icon (или другие настройки) отображалось во всех строках после нажатия на прядильщик, удалите переопределение «getDropDownView». – Brettins

Смежные вопросы