Android'de bir Spinner nasıl özelleştirilir


140

Spinner30dp diyelim ki açılır listeye özel bir yükseklik eklemek istiyorum ve açılır listesinin bölücülerini gizlemek istiyorum Spinner.

Şimdiye kadar aşağıdaki tarzı uygulamaya çalıştım 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>

ve çeviricimin kodu:

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

Ama hiçbir şey işe yaramıyor gibi görünüyor.



Stilin hiçbiri uygulanmadı mı? popupBackGround mu yoksa başka bir şey mi? Garip.
Chintan Soni

@Houcine: Ben zaten bu örnekleri denedim .. açılır listenin yüksekliğini ayarlamak istiyorum
Shruti

@ shree202: stil uygulanmaz
Shruti

1
@ComeIn, bir Android stili değil, oluşturduğu özel bir stil. Bu yüzden sadece "style ="
CyberClaw

Yanıtlar:


194

Çarkınız için özel bir düzen ile özel bir adaptör oluşturun.

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

Stillerde, gereksinimlerinize göre özel boyutlarınızı ve yüksekliğinizi ekleyin.

 <style name="spinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">

  </style>

  <style name="spinnerDropDownItemStyle" parent="android:TextAppearance.Widget.TextView.SpinnerItem">

  </style>

3
Değiştirmeyi deneyin <item name="android:height"> için<item name="android:layout_height">
Tarun

1
cevap için teşekkürler .. denedim ama hiçbir etkisi ... son 3-4 gün boyunca açık / kapalı üzerinde çalışıyor .. Sadece şimdi sinirleniyor :(
7bluephoenix

5
@Tarun, android:id="@+android:id/text1"simple_spinner_dropdown_item.xml dosyasında ihtiyacınız yok mu?
batbrat

1
R.layout.simple_spinner_dropdown_item'de android: layout_height değerini "? Attr / dropdownListPreferredItemHeight" olarak değiştirin veya bir hata
mesajı

9
Bu yanıtı gelecekteki ziyaretçiler için : TextView ve CheckedTextview öğelerini bir mizanpajın içine sarmayın . Doğrudan layout_file.xml dosyanıza gönderin. Hatanın ne olduğunu bulana kadar birkaç saat burada kaldım.
Francisco Romero

95

Gibi tamamen özel spinner tasarımı oluşturabilirsiniz

Adım 1: Çekilebilir klasörde, değer değiştiricinin kenarlığı için background.xml yapın.

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

Adım 2: Döndürücünün düzen tasarımı için bu açılır simgeyi veya herhangi bir görüntü drop.png kullanın resim açıklamasını buraya girin

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

Sonunda aşağıdaki görüntü gibi görünüyor ve yuvarlak alanda her yerde tıklanabilir ve imageView için tıklayın Lister yazmanıza gerek yok.

resim açıklamasını buraya girin

Adım3: Açılır tasarım için, açılır listeden satırı kaldırın ve arka plan rengini değiştirin,

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

Düzen klasöründe R.layout.spinner_text.xml dosyasını oluşturun

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

Düzen klasöründe simple_spinner_dropdown.xml oluşturun

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

Stillerde, ihtiyacınıza göre özel boyutlar ve yükseklik ekleyebilirsiniz.

<style name="spinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">
</style>

<style name="spinnerDropDownItemStyle" parent="android:TextAppearance.Widget.TextView.SpinnerItem">
</style>

Sonunda şöyle görünüyor

resim açıklamasını buraya girin

Gereksinime göre, simple_spinner_dropdown.xml dosyasının arka plan rengini veya metin rengini değiştirerek arka plan rengini ve açılır renk metnini değiştirebilirsiniz.


snipped ilk kodda 6 satırında android: height = "1dp" demek?
Willi Mentzel

Yanlışlıkla iki kez android yazın: width = "1dp"
Binesh Kumar

2
Sorun değil, sadece kendim düzenlemek istemedim çünkü emin değildi, "1dp" ile yükseklik belirtmek istiyorsanız ya da sadece bir kopya olup olmadığını. iyi cevap olsa. :)
Willi Mentzel

@BineshKumar Hey CheckedTextView'ı nerede bildirdiğinizi öğrenebilir miyim? Çünkü koda yapıştırdığımda bana öğenin önce bildirilmesi gerektiğini söyledi
hyperfkcb

2
Dostum, mizanpajlarınızda ve çekmecelerinizde isimler kullanabilirdiniz, yarım saatimi harcadım ve ne yapacağımı bilmiyorum. Kötü cevap için eksi.
Anton Kizema

21

Şimdiye kadar bulduğum en zarif ve esnek çözüm burada: http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html

Temel olarak şu adımları izleyin:

  1. Açılır öğeniz için özel düzen xml dosyası oluşturun, diyelim ki spinner_item.xml diyeceğim
  2. Açılır Bağdaştırıcınız için özel görünüm sınıfı oluşturun. Bu özel sınıfta, getView () ve getDropdownView () yönteminde özel açılır öğe düzeninizin üzerine yazmanız ve ayarlamanız gerekir. Kodum aşağıdaki gibidir:

    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. Etkinliğinizde veya parçanızda, döndürücü görünümünüz için özel bağdaştırıcıyı kullanın. Bunun gibi bir şey:

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

burada seçenekler, açılır öğe dizesinin listesidir.


Benim için hile getDropDownView geçersiz kılıyordu, getView geçersiz kılıyordu, ama bu yöntemi geçersiz kılmak zorunda olduğunu fark etmedi.
estebanuri

7

Bunu dene

Ben başka bir çözüm denerken sorunları çok karşı karşıya idi ...... Ar-Ge çok sonra şimdi çözüm var

  1. mizanpaj klasörüne custom_spinner.xml oluşturun ve bu kodu yapıştırın

     <?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. aktivitesinde

    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. yeni bir adaptör sınıfı oluştur

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

Bu, döndürücüyü tıkladıktan sonra tüm öğelerdeki men_icon resmini verdi, bu da aradığım şey değildi. Dönücüyü tıkladıktan sonra men_icon görüntüsünün (veya diğer özelleştirmelerin) tüm satırlarda görünmesini istemiyorsanız, "getDropDownView" geçersiz kılmayı kaldırın.
Brettins

2

Bu benim için çalıştı:

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

ve düzen klasörümde oluşturdum 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" />

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.