Получить ссылку на Spinner в ActionBar

findViewById() отлично работает, когда вам нужно найти что-то в любом элементе пользовательского интерфейса, который есть в вашем макете. Однако, используя второй вариант этого ответа Как добавить раскрывающийся список на панели действий, я добавил Spinner к ActionBar.

Теперь проблема, с которой я столкнулся, заключается в том, как получить ссылку на этот Spinner, чтобы я мог изменить используемый им шрифт. Как это сделать?

Мое menu/sort_spinner выглядит так:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/sort" 
        android:showAsAction="always"
        android:title="@string/sort"
        android:actionLayout="@layout/actionbar_spinner"/>
</menu>  

и layout/actionbar_spinner вот так:

<Spinner xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:spinnerMode="dropdown"
    android:id="@+id/spinner"
    android:entries="@array/type" />

person An SO User    schedule 23.07.2014    source источник


Ответы (2)


Вы должны сделать это в public boolean onCreateOptionsMenu(Menu menu).

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.sort_spinner, menu);
    MenuItem spinnerItem = menu.findItem(R.id.sort);
    Spinner spinner = (Spinner)spinnerItem.getActionView().findViewById(R.id.spinner);
    //Your rest of code...
    return super.onCreateOptionsMenu(menu);
}
person Harikrishnan    schedule 23.07.2014
comment
а Typeface? Я не использую специальный адаптер :) - person An SO User; 23.07.2014
comment
вы уверены насчет findItem(R.id.sort)? Вы уверены, что это не должно быть R.id.spinner? - person An SO User; 23.07.2014
comment
Вы назначаете MenuItem счетчику. - person Simas; 23.07.2014
comment
@user3249477 user3249477 Да, меня мучило ощущение, что что-то не так :) - person An SO User; 23.07.2014
comment
Извините, я не прочитал вопрос полностью и сделал глупую ошибку в коде. Я не пробовал это, но это должно сработать. Обновил код. Пожалуйста, проверьте. :) - person Harikrishnan; 23.07.2014
comment
@LittleChild Извините, но, насколько я знаю, для изменения шрифта вам придется использовать специальный адаптер для счетчика. Проверьте этот ответ: stackoverflow.com/questions /19150588/ - person Harikrishnan; 23.07.2014

Внутри вашего onCreateOptionsMenu вы можете сохранить глобальную ссылку на ваше меню следующим образом:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.actionbar_items, menu);
    mMenu = menu;
    ...
}

РЕДАКТИРОВАТЬ:

Однако для изменения шрифта вам придется использовать адаптер. Вот пример, который должен работать.

MenuItem item = mMenu.findItem(R.id.sort);
Spinner spinner = (Spinner) item.getActionView().findViewById(R.id.spinner);

MyAdapter adapter = new MyAdapter(this, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

spinner.setAdapter(adapter);

private class MyAdapter extends ArrayAdapter {

    public MyAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    public TextView getView(int position, View convertView, ViewGroup parent) {
        TextView v = (TextView) super.getView(position, convertView, parent);
        v.setTypeface(myFont);
        return v;
    }

    public TextView getDropDownView(int position, View convertView, ViewGroup parent) {
        TextView v = (TextView) super.getView(position, convertView, parent);
        v.setTypeface(myFont);
        return v;
    }

}
person Simas    schedule 23.07.2014
comment
а теперь Typeface для текста внутри счетчика. Как? :) - person An SO User; 23.07.2014
comment
Нет способа избежать адаптера? :) - person An SO User; 23.07.2014
comment
Я боюсь, не. Вы должны установить шрифт для TextView, и это невозможно сделать, если вы не сделаете собственный адаптер. - person Harikrishnan; 23.07.2014
comment
@LittleChild зачем вам спиннер, если вы не планируете использовать адаптер? Как бы вы тогда его заполнили? - person Simas; 23.07.2014
comment
@user3249477 user3249477 Я думаю, что он на самом деле говорил о пользовательском адаптере. При необходимости он может просто заполнить его, используя ArrayAdapter. Нет необходимости настраивать. А вот для настройки TypeFace его обязательно нужно будет настроить. - person Harikrishnan; 23.07.2014
comment
@user3249477 user3249477 с использованием массива строк прямо из XML с использованием android:entries="@array/something" - person An SO User; 23.07.2014
comment
@LittleChild Вы знаете, что все еще можете использовать массив xml с пользовательским адаптером? - person Simas; 23.07.2014