Получете препратка към Spinner в ActionBar

findViewById() работи добре, когато трябва да намерите нещо, който и да е UI елемент, който е във вашето оформление. Използвайки обаче втората опция на този отговор Как да добавя падащ елемент в лентата за действия, добавих Spinner към моя ActionBar.

Сега проблемът, пред който съм изправен, е как да извлека препратка към този Spinner, така че да мога да променя шрифта, който използва. Как да направя това?

Моето меню/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 на spiner. - person Simas; 23.07.2014
comment
@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
Страхувам се че ... не. Трябва да зададете Typeface за TextView и това не може да стане, освен ако не направите персонализиран адаптер. - person Harikrishnan; 23.07.2014
comment
@LittleChild за какво ти трябва центрофугата, ако не смяташ да ползваш адаптер? Как иначе бихте го населили тогава? - person Simas; 23.07.2014
comment
@user3249477 Мисля, че той всъщност говореше за персонализиран адаптер. Ако е необходимо, той може просто да го попълни с помощта на ArrayAdapter. Няма нужда от персонализиране. Но за настройка TypeFace той определено ще трябва да я персонализира. - person Harikrishnan; 23.07.2014
comment
@user3249477 с помощта на низов масив направо от XML с помощта на android:entries="@array/something" - person An SO User; 23.07.2014
comment
@LittleChild Знаете ли, че все още можете да използвате xml масива с персонализирания адаптер? - person Simas; 23.07.2014