Android и ActionBarCompat: как изменить видимость действий во время выполнения на устройствах до ICS?
У меня есть Activity
, который extends ActionBarActivity
взято из образца кода ActionBarCompat
, и я пытаюсь показать/скрыть пункты меню (действия) во время выполнения.
Я пробовал использовать setVisible()
в MenuItem
и работает для ICS, но в pre-ICS он меняет видимость элементов меню (кнопка меню нажимает), тогда как ActionBar
не получает уведомление о меню изменения.
Любое решение? Спасибо заранее!
Ответы
Ответ 1
Я создал несколько альтернатив элементов панели действий в /res/menu/. Я держу члена, чтобы указать, какой из них я использую прямо сейчас. для замены меню, я вызываю:
protected void setMenuResource(int newMenuResourceId)
{
_menuResource = newMenuResourceId;
invalidateOptionsMenu();
}
И я переопределяю onCreateOptionsMenu():
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
if (_menuResource != 0)
{
getSupportMenuInflater().inflate(_menuResource, menu);
return true;
}
return super.onCreateOptionsMenu(menu);
}
Теперь, если я хочу изменить элементы действия, я вызываю:
setMenuResource(R.menu.actionbar_menu_X);
Ответ 2
Вот как я решил это:
В ActionBarHelperBase.java проекта actionbarcompat
...
private View addActionItemCompatFromMenuItem(final MenuItem item) {
final int itemId = item.getItemId();
....
Создатель этого класса копирует свойства объекта, но не копирует идентификатор элемента, поэтому его невозможно найти позже с идентификатором fiven.
Итак, я добавил его в этот метод:
...
actionButton.setId(itemId);
...
и в том же классе я просто использую:
@Override
public void hideMenuItemById(int id, boolean show){
getActionBarCompat().findViewById(id).setVisibility(show? View.VISIBLE: View.GONE);
}
Надеюсь, это поможет вам.
Ответ 3
Вы должны вызвать supportInvalidateOptionsMenu(), который является соответствующим методом для ActionBarActivity:
http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportInvalidateOptionsMenu()