Поехали
Продолжаем серию "Android для начинающих". Как же использовать ActionBarSherlock после его
установки?
- Для начала надо зайти в опции компилятора для проекта и поставить там использование Java 1.6.
- Далее меняем предка для активности - с Activity на SherlockActivity.
- Потом в манифесте добавляем атрибут для этой активности (или для всего приложения, что более логично):
android:theme="@style/Theme.Sherlock"
После это запускаем приложение и видим ActionBar в теме Holo dark со значком и наименованием приложения.
Если нужна светлая тема Holo light то, сооветственно вместо Theme.Sherlock пишем Theme.Sherlock.Light.
Навигация
Навигация через выпадающее меню
Для навигации через выпадающим список (Spinner) скопируем в OnCreate активности код из примера, поставляемого с ActionBarSherlock:
mLocations = getResources().getStringArray(R.array.locations);
Context context = getSupportActionBar().getThemedContext();
ArrayAdapter list = ArrayAdapter.createFromResource(
context, R.array.locations, R.layout.sherlock_spinner_item);
list.setDropDownViewResource(
R.layout.sherlock_spinner_dropdown_item);
getSupportActionBar().setNavigationMode(
ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setListNavigationCallbacks(list, this);
R.array.locations - это набор элементов выпадающего списка (т.е. по сути набор страниц/экранов приложения, по которым досупна навигация). R.layout.sherlock_spinner_dropdown_item разрешается автоматически, делать чего-то в своем layout не надо.
Для обработки выбора элемента списка (и реализации навигации) нужно будет реализовать в активности интерфейс OnNavigationListener (ну или передать другую реализацию интерфейса в вызов setListNavigationCallbacks).
Навигация через табы
Для реализации навигации через табы тоже можно скопировать код из примера:
getSupportActionBar().setNavigationMode(
ActionBar.NAVIGATION_MODE_TABS);
for (int i = 1; i <= 3; i++) {
ActionBar.Tab tab = getSupportActionBar().newTab();
tab.setText("Tab " + i);
tab.setTabListener(this);
getSupportActionBar().addTab(tab);
}
Здесь уже активности нужно будет реализовать интерфейс TabListener.
На устройствах с HVGA-экраном набор ActionBar+табы может занимать непозволительно много места, поэтому можно скрыть ActionBar, оставив одни табы:
getSupportActionBar().setDisplayShowHomeEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(false);
Действия
Создание
ActionBar на то и ActionBar, чтобы показывать пользователю не только навигацию, но и действия. Добавление действий описано в демо-примере так:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Used to put dark icons on light action bar
boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
menu.add("Save")
.setIcon(isLight ?
R.drawable.ic_compose_inverse :
R.drawable.ic_compose)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
menu.add("Search")
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
menu.add("Refresh")
.setIcon(isLight ? R.drawable.ic_refresh_inverse :
R.drawable.ic_refresh)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
return true;
}
Обработка
Для обработки действий есть две альтернативы:
- Реализовать метод onOptionsItemSelected, в который будут приходить события на каждое действие.
- Действиям задать индивидуальные обработчики при помощи метода setOnMenuItemClickListener()
Выводы
По факту ActionBar оказался довольно простой в использовании компонентой, по крайней мере там, где дело касается самых основ.