ActionBarSherlock – Удобная реализация UI-паттерна ActionBar для Android-приложений – Часть II
Это вторая часть рассказа о библиотеке ActionBar Sherlock, реализующей UI-паттерн ActionBar для Android-приложений, а также еще ряд дополнительных возможностей. В этой части речь пойдет о том, как можно реализовать навигацию в приложении с использованием ActionBar и какие для этого есть возможности в ActionBar Sherlock.
Кастомная навигация
В ActionBar Sherlock есть возможность разместить свой View внутри ActionBar и использовать его для навигации. Так, например, можно разместить RadioGroup и при нажатии на RadioButton внутри нее переходить на нужную страницу в UI.
Пример такого XML-файла для контрола навигации ниже:
В коде 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(); ArrayAdapterlist = 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 самой библиотеки, позволяют понять что и как можно использовать в своем приложении.
Еще интересные посты о программировании для мобильных устройств:
No Comments
Make A CommentNo comments yet.
Comments RSS Feed TrackBack URL