среда, 18 апреля 2012 г.

Android: используем ActionBarSherlock

Поехали

Продолжаем серию "Android для начинающих". Как же использовать ActionBarSherlock после его установки?
  1. Для начала надо зайти в опции компилятора для проекта и поставить там использование Java 1.6.
  2. Далее меняем предка для активности - с Activity на SherlockActivity.
  3. Потом в манифесте добавляем атрибут для этой активности (или для всего приложения, что более логично):
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;
    }

Обработка

Для обработки действий есть две альтернативы:
  1. Реализовать метод onOptionsItemSelected, в который будут приходить события на каждое действие.
  2. Действиям задать индивидуальные обработчики при помощи метода setOnMenuItemClickListener()

Выводы

По факту ActionBar оказался довольно простой в использовании компонентой, по крайней мере там, где дело касается самых основ.

Комментариев нет: