Bagaimana cara mengatur tema yang berbeda untuk dropdown Spinner?

102

Contoh penggunaan:

masukkan deskripsi gambar di sini

Spinner bertema gelap, tetapi saya ingin menu dropdown bertema terang.

Chris Banes
sumber

Jawaban:

195

Android M

Baru di Android 6.0, Spinner sekarang memiliki android:popupThemeparameter yang memungkinkan Anda untuk mengatur tema yang digunakan untuk popup (dropdown).

Anda dapat menggunakannya sebagai:

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:popupTheme="@android:style/ThemeOverlay.Material.Light" />

Itu akan berfungsi pada perangkat yang menjalankan API level 23+, tetapi tidak pada perangkat yang menjalankan versi Android yang lebih rendah.

AppCompat

Di sinilah AppCompat berperan. Implementasi Spinner-nya juga mendukung popupTheme, tetapi sedikit lebih terlibat untuk melakukannya dengan benar.

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

Setelah itu, Anda perlu memperbarui Adaptor Anda agar dapat bekerja dengan AppCompat. Anda melakukannya dengan membuatnya mengimplementasikan ThemedSpinnerAdapterantarmuka baru .

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Metode ini digunakan oleh Spinner agar dapat memberi tahu Adaptor tema mana yang akan digunakan untuk meluaskan tampilan drop-down. Untuk membuatnya semudah mungkin, kami telah memberi Anda Helperkelas yang dapat Anda colokkan ke adaptor Anda.

Ini berarti adaptor Anda menjadi seperti:

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
  private final ThemedSpinnerAdapter.Helper mDropDownHelper;

  public MyAdapter(Context context) { 
    mDropDownHelper = new ThemedSpinnerAdapter.Helper(context);
  }

  @Override
  public View getDropDownView(int position, View convertView, ViewGroup parent) {
    View view;

    if (convertView == null) {
      // Inflate the drop down using the helper's LayoutInflater
      LayoutInflater inflater = mDropDownHelper.getDropDownViewInflater();
      view = inflater.inflate(R.layout.my_dropdown, parent, false);
    }

    // ...

    return view;
  }

  @Override
  public void setDropDownViewTheme(Theme theme) {
    mDropDownHelper.setDropDownViewTheme(theme);
  }

  @Override
  public Theme getDropDownViewTheme() {
    return mDropDownHelper.getDropDownViewTheme();
  }
}
Chris Banes
sumber
Hai, saya tidak bisa menemukan ThemedSpinnerAdapter di dalam appcompat-v7. Saya menggunakan versi 22.2.1. Apakah saya harus melakukan sesuatu yang berbeda untuk mengimpornya?
Douglas Alves
3
@DouglasAlves menggunakan terbaru 23.0.0
khusrav
Sepertinya Android Studio tidak tahu tentang app: popupTema Spinner atribut: "Aplikasi" awalan namespace tak terduga "ditemukan untuk tag Spinner". Lint juga gagal dengan kesalahan yang sama.
makovkastar
1
@ Chris Banes: Ini memberikan daftar drop-down dengan latar belakang gelap, terlepas dari tema yang Anda gunakan.
Ashwin
2
haruskah itu menggunakan "android.support.v7.widget.AppCompatSpinner" bukan "spinner" di xml?
Angel Koh
2

untuk panah pemintal, saya telah menggunakan android:backgroundTint="@color/white"ini akan bekerja dari API 21

untuk tampilan pemintal dan tampilan tarik-turun:

ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);

areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);

untuk getView () adaptor akan menggunakan spinner_item.xml

untuk getDropDownView () adaptor akan menggunakan dropdwon_item.xml

lalu Anda dapat menggunakan tata letak khusus sesuka Anda

semoga membantu

bsma
sumber
0

Hanya untuk referensi jika Anda menggunakan CursorAdapterimplementasi Anda bisa jauh lebih mudah, cukup timpa newView(), tidak perlu menimpa di getDropDownView()sana:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}
menghidupkan kembali
sumber
-6

Anda dapat mencoba ini: di folder tata letak Anda, buat spinner_item.xml:

<TextView 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:padding="10dp"
android:background = "#ffffff"
android:textColor="@color/primary_text"
android:textSize="@dimen/text_size_normal" />

lalu gunakan kode ini:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);
Ahmad Azarnia
sumber
6
Saya kira karena cukup jelas itu tidak menjawab pertanyaan itu. Pertanyaannya adalah tentang menetapkan tema, saya tidak melihat referensi ke tema dalam jawaban ini. Supaya kami jelas, saya tidak meremehkan ini, yang lain sudah cukup melakukannya.
Lihat