ActionBarSherlock: программно отображать / скрывать кнопки Action Item посредством вызова метода

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

Кнопки должны идеально выглядеть так же, как те, которые создаются при определении пунктов меню как элементов действия с использованием android:showAsAction="ifRoom|withText" , как показано здесь .

Моя проблема в том, что, насколько я могу судить, стандартный API ActionBar не предоставляет такого механизма для отображения или скрытия кнопок Action Item по желанию, и единственный раз, когда элементы меню могут быть определены, находится внутри onCreateOptionsMenu() который, конечно, называется Системой.

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

Если я иду по пути использования .setCustomView() , я бы хотел, чтобы мои кнопки выглядели идентичными кнопкам Action Item, которые ActionBarSherlock отображает для элемента меню, который имеет атрибут android:showAsAction="ifRoom|withText" . Чтобы это сделать, может ли кто-нибудь сообщить мне, какую конкретную тему, стиль или макеты из библиотеки ActionBarSherlock я должен использовать? Я уже пытался использовать R.layout.abs__action_menu_item_layout , но попытка раздуть этот макет создает исключение, относящееся к colorStateList при попытке взвинчивания R.layout.abs__action_menu_item_layout , которое содержит макет.

Если вы хотите, чтобы эти две кнопки имели внешний вид элементов меню, вы должны сделать им пункты меню. Ваше предположение о том, что пункты меню могут быть определены только в onCreateOptionsMenu() , неверно, потому что также существует метод, называемый onPrepareOptionsMenu() , который будет вызываться каждый раз прямо перед отображением меню. Вместе с методом invalidateOptionsMenu() для активности вы можете легко создать меню, которое отражает текущее состояние в реальном времени.

Альтернативой является сохранение ссылки на отдельные объекты MenuItem , так как документация заявляет о своем сохранении, чтобы удерживать их, и изменять их видимость, когда это необходимо. Вам все равно придется вызвать invalidateOptionsMenu() чтобы обновить меню – я не могу вспомнить с головы. ( Редактировать: Джейк избил меня на этом)

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

Вы можете вызвать setVisibility в экземплярах MenuItem .

В документации указано, что «вы можете безопасно держаться за меню (и любые элементы, созданные из него), внося изменения в него по желанию, до тех пор, пока не будет вызываться onCreateOptionsMenu ()».

Вы проверили образцы демо?

У них есть эта функция там, на «переключателях функций».