Spinner'ın açılır menüsü için nasıl farklı bir tema ayarlayabilirim?


102

Örnek bir kullanım:

görüntü açıklamasını buraya girin

Spinner karanlık temalıdır, ancak açılır menünün açık temalı olmasını istiyorum.

Yanıtlar:


195

Android M

Android 6.0'da yeni olan Spinner, artık android:popupThemeaçılır pencere (açılır menü) için kullanılan temayı ayarlamanıza izin veren parametreye sahiptir.

Bunu şu şekilde kullanabilirsiniz:

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

Bu, API seviyesi 23+ çalıştıran cihazlarda çalışır, ancak Android'in daha düşük bir sürümünü çalıştıran cihazlarda çalışmaz.

AppCompat

AppCompat burada devreye giriyor. Spinner uygulaması da destekliyor popupTheme, ancak doğru yapmak için biraz daha karmaşık.

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

Bundan sonra, AppCompat ile çalışabilmek için Adaptörünüzü güncellemeniz gerekir. Bunu, yeni ThemedSpinnerAdapterarayüzü uygulamasını sağlayarak yaparsınız .

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Bu yöntemler, Bağdaştırıcıya herhangi bir açılır görünümü şişirmek için hangi temanın kullanılacağını söyleyebilmek için Spinner tarafından kullanılır. Bunu olabildiğince kolaylaştırmak Helperiçin, adaptörünüze takabileceğiniz bir sınıf verdik .

Bu, adaptörünüzün şunun gibi olduğu anlamına gelir:

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

Merhaba, appcompat-v7 içinde ThemedSpinnerAdapter bulamadım. 22.2.1 sürümünü kullanıyorum. İçeri aktarmak için farklı bir şey yapmam gerekiyor mu?
— Douglas Alves

3
@DouglasAlves en yeni 23.0.0 kullanıyor
— khusrav

Görünüşe göre Android Studio, uygulamayı bilmiyor: popupTheme Spinner özniteliği: "Spinner etiketi için" beklenmeyen ad alanı öneki "uygulama" bulundu. Lint de aynı hatayla başarısız olur.
— makovkastar

1
@Chris Banes: Kullandığınız temadan bağımsız olarak açılır listeyi koyu bir arka planla verir.
— Ashwin

2
xml'de "döndürücü" yerine "android.support.v7.widget.AppCompatSpinner" kullanmalı mı?
— Angel Koh

2

spinner'ın oku için kullandım android:backgroundTint="@color/white"bu API 21'den çalışacak

değer değiştirici görünümü ve açılır görünüm için:

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

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

için GetView () adaptör spinner_item.xml kullanır

için getDropDownView () adaptör dropdwon_item.xml kullanır

o zaman özel düzenlerinizi istediğiniz gibi kullanabilirsiniz

Umarım yardımcı olur


0

Sadece referans için CursorAdapter, uygulamanızı kullanırsanız çok daha kolay olabilir, sadece geçersiz kılın newView(), orada geçersiz kılmaya gerek getDropDownView()yok:

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

-5

şunu deneyebilirsiniz: layout klasörünüzde spinner_item.xml oluşturun:

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

sonra bu kodu kullanın:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);

6
Sanırım soruyu cevaplamadığı oldukça açık olduğu için. Soru bir tema belirlemekle ilgili, bu cevapta temaya referans göremiyorum. Anlaşıldığına göre, buna olumsuz oy vermedim, diğerleri zaten yeterince karar verdi.
— 28'e bakın.
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.