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.