Добавление счетчика в ActionBar (не Navigation

Я добавил счетчик в свою панель действий, используя второй вариант ответа здесь .

Как добавить адаптер счетчика к счетчику? Я попытался использовать объект Spinner, как Google описывает здесь, но получаю нулевой объект Spinner.

Кто-нибудь знает, как это сделать? Я не хочу, чтобы счетчик находился в области навигации панели действий, но вместе с другими элементами действий (я использую разделенную панель действий).

Спасибо за помощь!


person user1509130    schedule 07.07.2012    source источник


Ответы (3)


Я знаю, что это старый вопрос, но на всякий случай, если кто-то наткнется на него (как я) и все еще ищет полный ответ, вот как это сделать с помощью библиотеки совместимости, чтобы он работал от до v7 (Android 2.1 Эклер) до текущей версии 19 (Android 4.4 KitKat):

В menu_layout.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >

  <item android:id="@+id/spinner"
    yourapp:showAsAction="ifRoom"
    yourapp:actionViewClass="android.widget.Spinner" />
</menu>

Использование пространства имен http://schemas.android.com/apk/res-auto с псевдонимом yourapp позволяет использовать атрибуты showAsAction и actionViewClass, которых нет в более ранних версиях Android.

Затем в вашем коде активности:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_layout, menu);
    MenuItem item = menu.findItem(R.id.spinner);
    Spinner spinner = (Spinner) MenuItemCompat.getActionView(item);
    spinner.setAdapter(adapter); // set the adapter to provide layout of rows and content
    spinner.setOnItemSelectedListener(onItemSelectedListener); // set the listener, to perform actions based on item selection

И вуаля!

person François POYER    schedule 07.04.2014
comment
Если вы не хотите беспокоиться о старых версиях, пространство имен yourapp не требуется, вы можете работать с пространством имен Android. Кроме того, это прекрасно работает с CursorLoaders. - person lalitm; 24.04.2014
comment
Поскольку на данный момент Android 2.3.3 (API v10) по-прежнему составляет около 18% рынка Android (см. Android Dashboard для текущих цифр), я подумал, что важно предоставить ответ о совместимости. Но вы правы в том, что пространства имен Android достаточно, если минимальный целевой SDK вашего приложения выше Android 3.0 (API v11). - person François POYER; 28.04.2014
comment
@lalitm, если вы заметили, это для библиотеки совместимости. Определенно требуется, если вы стремитесь стать BC. - person frostymarvelous; 17.02.2016
comment
Предупреждение об этом: тестируя это на Nexus 6 с Android версии 6.0.1 - я обнаружил, что если на панели действий нет места для счетчика - он не будет отображать варианты. Это не работает в обычном положении меню. Ссылка на параметр showAsAction. Таким образом, на маленьких экранах это может оказаться неработающим элементом управления. - person RoundSparrow hilltx; 05.03.2016
comment
ХОРОШИЕ НОВОСТИ: кажется, что showAsAction=ifRoom|collapseActionView правильно работает как в меню, так и в панели действий... Я рекомендую эту комбинацию, если у вашего пользователя маленький экран. - person RoundSparrow hilltx; 05.03.2016
comment
Если ваш счетчик по-прежнему равен нулю и вы используете AppCompat версии 7, инициализируйте его с помощью app:actionViewClass="android.support.v7.widget.AppCompatSpinner" - person Zon; 10.05.2018

Я знаю, что вы отказались от счетчика, но я дам здесь несколько советов на случай, если у других людей возникнет та же проблема или вы захотите разработать тот же шаблон в другом приложении.

  • Если вы получили null, это потому, что вы неправильно указали идентификаторы. Дважды проверьте идентификаторы.
  • на ссылках, которые вы показали поверх сложных вещей, указав actionLayout, который является просто счетчиком, вы можете просто указать actionViewClass="android.widget.Spinner", который добьется цели.
  • затем в OnCreateOptionsMenu вы делаете:

    inflater.inflate(R.menu.my_menu, menu); // inflate the menu
    Spinner s = (Spinner) menu.findItem(R.id.my_menu_spinner).getActionView(); // find the spinner
    SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity().getActionBar()
            .getThemedContext(), R.array.my_menu_spinner_list, android.R.layout.simple_spinner_dropdown_item); //  create the adapter from a StringArray
    s.setAdapter(mSpinnerAdapter); // set the adapter
    s.setOnItemSelectedListener(myChangeListener); // (optional) reference to a OnItemSelectedListener, that you can use to perform actions based on user selection
    

удачного кодирования...

person Budius    schedule 30.07.2012
comment
Любая идея, как это будет работать для пользовательского адаптера? Я использую изображения вместо текстовых слов для отображения в Spinner, поэтому строка SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity().getActionBar() .getThemedContext(), R.array.my_menu_spinner_list, android.R.layout.simple_spinner_dropdown_item); должна отличаться для пользовательского адаптера. Не могу понять как. - person Azurespot; 25.05.2015
comment
просто вызовите любой конструктор, который у вас есть в вашем пользовательском адаптере. SpinnerAdapter mSpinnerAdapter = new MyCustomAdapter() - person Budius; 25.05.2015
comment
Спасибо, Будиус, я так и сделал, но выпадающего списка почему-то не происходит. Я решил, что это произошло потому, что в моем пользовательском адаптере отсутствует android.R.layout.simple_spinner_dropdown_item (поскольку он использует строку Spinner в качестве ImageView, места, куда входит массив drawables). Но не уверен, что проблема в этом. Если вы хотите проверить мой код: stackoverflow.com/questions/30433501/ Вопрос до сих пор остается без ответа. Спасибо. - person Azurespot; 25.05.2015

Ну, я отказался от идеи Spinner для использования подменю. Я понял, что счетчик предназначен для выбора вещей, которые остаются выбранными; подменю, похоже, лучше подходят для пользовательского интерфейса.

person user1509130    schedule 10.07.2012