Як встановити іншу тему для спадного меню Spinner?


Відповіді:


195

Android M

Новий в Android 6.0, Spinner тепер має android:popupThemeпараметр, який дозволяє встановити тему, що використовується для спливаючого вікна (випадаючого).

Ви можете використовувати його так:

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

Це працюватиме на пристроях, на яких працює API 23+ рівня, але не на пристроях із нижчою версією Android.

AppCompat

Тут входить AppCompat. Її реалізація Spinner також підтримує popupTheme, але це трохи більше задіяно, щоб отримати право.

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

Після цього вам потрібно оновити адаптер, щоб мати можливість працювати з AppCompat. Ви робите це, роблячи його реалізувати новий ThemedSpinnerAdapterінтерфейс.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

Ці методи використовуються Spinner, щоб мати можливість вказати Адаптер, яку тему використовувати для надування будь-яких випадаючих поглядів. Щоб зробити це максимально просто, ми дали вам Helperклас, який ви можете підключити до свого адаптера.

Це означає, що ваш адаптер стає чимось на зразок:

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

Привіт, я не зміг знайти ThemedSpinnerAdapter всередині appcompat-v7. Я використовую версію 22.2.1. Чи потрібно робити щось інше, щоб імпортувати його?
Дуглас Алвеш

3
@DouglasAlves використовує новітні 23.0.0
kususrav

Здається, Android Studio не знає про додаток: атрибут popupTheme Spinner: "Неочікуваний префікс простору імен" додаток "знайдено для тегу Spinner". Лінія також виходить з тієї ж помилки.
маковкастар

1
@Chris Banes: Він дає випадаючий список із темним фоном, незалежно від теми, яку ви використовуєте.
Ешвін

2
чи повинен він використовувати "android.support.v7.widget.AppCompatSpinner" замість "спінер" у xml?
Ангел Кох

2

для стрілки спінера я використав android:backgroundTint="@color/white"це для роботи з API 21

для подання спинера та спаду:

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

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

для getView () адаптер буде використовувати spinner_item.xml

для getDropDownView () адаптер буде використовувати dropdwon_item.xml

то ви можете використовувати власні макети, як вам подобається

сподіваюся, що це допомагає


0

Для довідки, якщо ви використовуєте, CursorAdapterваша реалізація може бути набагато простішою, просто переосмислити newView(), не потрібно перевизначати getDropDownView()там

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

-6

ви можете спробувати це: у папці макета зробіть 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" />

потім використовуйте цей код:

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

6
Я здогадуюсь, оскільки це досить очевидно, що це не відповідає на питання. Питання щодо встановлення теми, я не бачу посилання на тематику у цій відповіді. Просто ми зрозуміли, що я не спростовував цього, інші вже достатньо пішли на це.
2Dee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.