Bagaimana cara menyesuaikan Spinner di Android

140

Saya ingin menambahkan ketinggian khusus ke dropdown dari Spinner, katakanlah 30dp, dan saya ingin menyembunyikan pembagi daftar dropdown dari Spinner.

Sejauh ini saya mencoba menerapkan gaya berikut ke 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>

dan kode pemintal saya adalah:

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

Tapi sepertinya tidak ada yang berhasil.

Shruti
sumber
Tidak ada gaya yang diterapkan? popupBackGround atau yang lainnya? Aneh.
Chintan Soni
@Houcine: saya sudah mencoba contoh-contoh itu .. saya ingin menyesuaikan ketinggian dari daftar dropdown
Shruti
@ shree202: tidak ada gaya berlaku
Shruti
1
@ComeIn, ini bukan gaya Android, tapi yang dibuat khusus. Itu sebabnya dia baru saja "style ="
CyberClaw

Jawaban:

194

Buat adaptor khusus dengan tata letak khusus untuk pemintal Anda.

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

Dalam gaya tambahkan dimensi khusus dan tinggi sesuai kebutuhan Anda.

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

  </style>

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

  </style>
Tarun
sumber
3
Coba ubah <item name="android:height"> ke<item name="android:layout_height">
Tarun
1
thanx untuk membalas .. mencoba tetapi tidak berhasil ... mengerjakannya on / off selama 3-4 hari terakhir .. Baru saja kesal sekarang :(
7bluephoenix
5
@ Tarun, Apakah Anda tidak perlu android:id="@+android:id/text1"dalam file simple_spinner_dropdown_item.xml?
batbrat
1
Di R.layout.simple_spinner_dropdown_item, ubah nilai android: layout_height menjadi "? Attr / dropdownListPreferredItemHeight" atau Anda akan mendapatkan kesalahan: "Kesalahan: Atribut tidak bersifat publik"
Loenix
9
Untuk pengunjung masa depan untuk jawaban ini : jangan bungkus TextView dan CheckedTextview di dalam tata letak . Posting langsung di file layout_file.xml Anda. Saya terjebak di sini selama beberapa jam sampai saya menemukan apa kesalahannya.
Francisco Romero
95

Anda dapat membuat desain pemintal sepenuhnya kustom seperti

Langkah1: Di folder yang bisa digambar, buat background.xml untuk batas pemintal.

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

Step2: untuk desain tata letak spinner gunakan ikon drop-down ini atau gambar drop.png apa pun masukkan deskripsi gambar di sini

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

Akhirnya terlihat seperti gambar di bawah ini dan di mana-mana dapat diklik di area bundar dan tidak perlu menulis klik Lister untuk imageView.

masukkan deskripsi gambar di sini

Langkah 3: Untuk desain drop-down, hapus garis dari Dropdown ListView dan ubah warna latar belakang, Buat adaptor khusus seperti

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

Dalam folder layout buat 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"
/>

Dalam folder layout buat 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" />

Dalam gaya, Anda dapat menambahkan dimensi dan tinggi khusus sesuai kebutuhan Anda.

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

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

Akhirnya terlihat seperti

masukkan deskripsi gambar di sini

Menurut persyaratan, Anda dapat mengubah warna latar belakang dan teks warna drop-down dengan mengubah warna latar belakang atau warna teks simple_spinner_dropdown.xml

Binesh Kumar
sumber
dalam kode pertama terpotong maksudmu android: height = "1dp" di baris 6?
Willi Mentzel
Secara tidak sengaja dua kali menulis android: width = "1dp"
Binesh Kumar
2
Tidak masalah, saya hanya tidak ingin mengeditnya sendiri karena saya tidak yakin, apakah Anda ingin menentukan ketinggian dengan "1dp" atau jika itu hanya duplikat. jawaban yang bagus. :)
Willi Mentzel
@BineshKumar Hai, bolehkah saya tahu di mana Anda menyatakan CheckedTextView? Karena ketika saya menempelkan kode, ia memberi tahu saya elemen yang harus dideklarasikan terlebih dahulu
hyperfkcb
2
Sobat, Anda bisa menggunakan nama di layout dan drawable Anda, saya telah menghabiskan setengah jam dan masih tidak tahu apa yang harus dilakukan. Minus untuk jawaban yang buruk.
Anton Kizema
21

Solusi paling elegan dan fleksibel yang saya temukan sejauh ini ada di sini: http://android-er.blogspot.sg/2010/12/custom-arrayadapter-for-spinner-with.html

Pada dasarnya, ikuti langkah-langkah ini:

  1. Buat file xml layout khusus untuk item dropdown Anda, katakanlah saya akan menyebutnya spinner_item.xml
  2. Buat kelas tampilan khusus, untuk Adapter dropdown Anda. Di kelas khusus ini, Anda perlu menimpa dan mengatur tata letak item dropdown kustom di metode getView () dan getDropdownView (). Kode saya adalah sebagai berikut:

    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. Dalam aktivitas atau fragmen Anda, gunakan adaptor khusus untuk tampilan pemintal Anda. Sesuatu seperti ini:

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

di mana opsi adalah daftar string item dropdown.

Tony Vu
sumber
Trik untuk saya adalah mengganti getDropDownView, saya mengganti getView, tetapi tidak menyadari bahwa saya harus mengganti metode itu.
estebanuri
7

Coba ini

Saya menghadapi banyak masalah ketika saya mencoba solusi lain ...... Setelah banyak R&D sekarang saya mendapat solusi

  1. buat custom_spinner.xml di folder tata letak dan tempel kode ini

     <?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. dalam aktivitas Anda

    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. buat kelas adaptor baru

    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;
    }
    }
Sunil
sumber
Ini memberi saya gambar men_icon pada semua item setelah mengklik pemintal, yang bukan yang saya cari. Jika Anda tidak ingin gambar men_icon (atau kustomisasi lainnya) muncul di semua baris setelah mengklik pemintal, maka hapus override "getDropDownView".
Brettins
2

Ini bekerja untuk saya:

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

dan di folder layout saya saya buat 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" />
zizoujab
sumber
0

Saya telah membangun proyek demo kecil di sini Anda bisa melihatnya Tautan ke proyek

Vivek Barai
sumber