2015-08-18 3 views

ответ

190

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

Отлично! Спасибо, chris –

+0

Привет, я не смог найти ThemedSpinnerAdapter внутри appcompat-v7. Я использую версию 22.2.1. Нужно ли мне что-то менять, чтобы импортировать его? –

+3

@DouglasAlves используют новейшие 23.0.0 – khusrav

-5

вы можете попробовать это: в вашей папке макета сделать 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); 
+1

Итак, если вы положили -1 на это, почему бы вам не объяснить, почему? – Bostone

+5

Я думаю, потому что это довольно очевидно, что он не отвечает на вопрос. Вопрос заключается в настройке темы, я не вижу ссылки на тематику в этом ответе. Просто так мы поняли, что я не сделал этого, другие уже на это уже успели. – 2Dee

0

Только для справки, если вы используете CursorAdapter ваш imp lementation может быть гораздо проще, просто переопределить newView(), нет необходимости переопределять getDropDownView() есть:

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false); 
} 
Смежные вопросы