Это вторая часть рассказа о библиотеке ActionBar Sherlock, реализующей UI-паттерн ActionBar для Android-приложений, а также еще ряд дополнительных возможностей. В этой части речь пойдет о том, как можно реализовать навигацию в приложении с использованием ActionBar и какие для этого есть возможности в ActionBar Sherlock.

Кастомная навигация

В ActionBar Sherlock есть возможность разместить свой View внутри ActionBar и использовать его для навигации. Так, например, можно разместить RadioGroup и при нажатии на RadioButton внутри нее переходить на нужную страницу в UI.
Пример такого XML-файла для контрола навигации ниже:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:gravity="left|center_vertical"
    android:orientation="horizontal"
    >
    <RadioGroup
        android:id="@+id/radio_nav"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <RadioButton
            android:id="@+id/nav_page_a"
            android:text="Page A"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <RadioButton
            android:id="@+id/nav_page_b"
            android:text="Page B"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RadioGroup>
</LinearLayout>

В коде Activity необходимо вызвать метод getSupportActionBar().setCustomView() и нужній контрол будет размещен в ActionBar.

public class ActionBarSherlockTestActivity extends SherlockActivity {
	
	static final int [] pages = {
		R.layout.page_a,
		R.layout.page_b
	};
	
	private void setPage(int page_index) {
		setContentView(pages[page_index]);
	}

    @Override
    public void onCreate(Bundle savedInstanceState) {
    	setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        View customNav = getLayoutInflater().inflate(R.layout.cusom_navigation, null);
        
        ((RadioGroup)customNav.findViewById(R.id.radio_nav)).setOnCheckedChangeListener(new OnCheckedChangeListener() {
            public void onCheckedChanged(RadioGroup group, int checkedId) {
            	int page_index = checkedId == R.id.nav_page_a ? 0 : 1;
            	setPage(page_index);
            }

        });
        
        getSupportActionBar().setCustomView(customNav);
        getSupportActionBar().setDisplayShowCustomEnabled(true);
        setPage(0);
    }
}

На вид получится так:

Вкладки (Tabs)

Возможность работы с вкладками сама по себе очень полезна для отображения ограниченного количества страниц в интерфейсе пользователя (напомню что “ограниченное количество страниц”, согласно UI Design Guidelines это максимум 4 страницы).
Для того, чтобы иметь возможность отображать вкладки в ActionBar нужно указать для ActionBar режим NAVIGATION_MODE_TABS. Делается это посредством метода getSupportActionBar().setNavigationMode(). Затем нужно создать нужное количество объектов Tab с помощью getSupportActionBar().newTab(), заполнить в них информацию о вкладке (например заголовок и listener) и добавить в ActionBar с помощью getSupportActionBar().addTab(tab):

public class TabNavigation extends SherlockActivity i
		mplements ActionBar.TabListener {
    
	private TextView mSelected;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        setContentView(R.layout.tab_navigation);
        mSelected = (TextView)findViewById(R.id.text);

        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);
        }
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction transaction) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction transaction) {
        mSelected.setText("Selected: " + tab.getText());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction transaction) {
    }
}

В listener’е можно получать уведомления о переходе на вкладку и выходе с вкладки.
По поводу же смены layout’а, то этот функционал надо реализовывать самостоятельно.
Очень полезной является возможность отображать вкладки второй строкой в ActionBar в портретном режиме и встраивать их в ActionBar в ландшафтном режиме для экономии места.

Навигация списком

Навигацию с помощью выпадающего списка есть смысл использовать для переходов между страницами, когда их больше 4х. Для того, чтобы с помощью ActionBar Sherlock реализовать выпадающий список в ActionBar нужно сделать следующее:

  • Указать Navigation Mode равным NAVIGATION_MODE_LIST
  • Установить адаптер с элементами навигации и listener для получения сообщений о навигации с помощью getSupportActionBar().setListNavigationCallbacks()

В коде это будет выглядеть как-то так:

public class ListNavigation extends SherlockActivity 
		implements ActionBar.OnNavigationListener {
    private TextView mSelected;
    private String[] mLocations;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(SampleList.THEME); //Used for theme switching in samples
        super.onCreate(savedInstanceState);

        setContentView(R.layout.list_navigation);
        mSelected = (TextView)findViewById(R.id.text);

        mLocations = getResources().getStringArray(R.array.locations);

        Context context = getSupportActionBar().getThemedContext();
        ArrayAdapter<CharSequence> 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);
    }

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
        mSelected.setText("Selected: " + mLocations[itemPosition]);
        return true;
    }
}

Визуально все это выглядит так:

Функционал по смене лайаута надо тоже реализовывать руками.

Кнопка возврата

Есть также возможность отображения кнопки возврата в предыдущую activity в левой части ActionBar. Для этого использается метод getSupportActionBar().setDisplayHomeAsUpEnabled(). В результате получаем такой внешний вид ActionBar:

Исходный код всех примеров можно скачать вместе с дистрибутивом библиотеки. Примеры, которые идут в поставке покрывают абсолютно все аспекты использования ActionBar Sherlock и, хотя не блещут элегантностью и богатством реализации дополнительных фич, не связанных с API самой библиотеки, позволяют понять что и как можно использовать в своем приложении.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

Leave a Reply

Your email address will not be published. Required fields are marked *

Н.

Наша Android-игра на конкурсе мобильных приложений от HTC

Зарелизили Android-версию Tetra Master‘а, мини-игры из Final Fantasy IX и отправили на конкурс Android-приоложений от HTC.
Кому интересно – страница приложения на конкурсе здесь.
Игра доступна в маркете для бесплатной загрузки, работает на телефонах и таблетках с Android OS 1.6 и выше.

В игре есть поддержка русского, украинского, английского языка.

Всем сочувствующим просьба: проголосуйте за игру в конкурсе (звездочками)?
Комментарии\советы по улучшению, багрепорты в маркете приветствуются, в ближайшее время планируем сетевой геймплей!

A.

Android Market поможет разработчикам продавать свои приложения для платформы Google Android

А ведь вот какую штуку анонсировали в блоге разработчиков Google Android.

Android Market – это открытая система распространения мобильного контента, такого как, например, мобильные приложения и игры. Планируется что с помощью Android Market пользователи смогут искать, загружать и оплачивать мобильный контент различного типа. Система ориентирована прежде всего на программное обеспечение. Так что, если вы уже начали разработку приложений для устройств под управлением Google Android, и вопрос о том, как же пользователи смогут получить доступ к вашему продукту не дает вам покоя, то Android Market может стать для вас очень полезным сервисом.

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

Также завялено что, скорее всего, первые устройства на платформе Google Android будут содержать версию Mobile Market с поддержкой загрузки бесплатных приложений. Затем, в скором времени, планируется обновление, которое обеспечит поддержку также и проприетарных программных продуктов.

Выглядеть Mobile Market будет приблизительно так: