Лекция Android. Fragments, ActionBar, Drawer
description
Transcript of Лекция Android. Fragments, ActionBar, Drawer
![Page 1: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/1.jpg)
«Новые» элементы Android
FragmentsActionBar
Drawer
![Page 2: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/2.jpg)
18:45 2 из 50
Что такое Фрагменты?
● Являются частью activity.
● Имеют собственный жизненный цикл.
● Могут быть использованы повторно (в др. activity).
● Статическое и динамическое добавление.
● Может существовать без видимого интерфейса.
● Можно «вручную» поместить в BackStack.
● Добавлены в API Level 11 (Android 3.0)
![Page 3: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/3.jpg)
18:45 3 из 50
Зачем?
● Рациональное использование больших экранов.
![Page 4: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/4.jpg)
18:45 4 из 50
Зачем?
● Рациональное использование больших экранов.
● Инкапсулирует некоторую функциональность.
● Улучшают повторное использование компонентов.
● Управление BackStack.
![Page 5: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/5.jpg)
18:45 5 из 50
Создание фрагментов
● Определить класс-наследник от Fragment.
● Код очень похож на код в activity.
● Важные методы жизненного цикла:
– onCreate();
– onCreateView();
– onPause();
![Page 6: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/6.jpg)
18:45 6 из 50
Создание фрагментов
● Специализированные классы-наследники Fragment
– DialogFragment
Создание всплывающего диалогового окна
– ListFragment
Отображение списка элементов (похоже на ListActivity)
– PreferenceFragment
Отображение списка настроек (похоже на PreferenceActivty)
![Page 7: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/7.jpg)
18:45 7 из 50
![Page 8: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/8.jpg)
18:45 8 из 50
- onDestroyView()
- onDetach()
Управление жизненным циклом
● 3 состояния:
– Resumed (выполнение),
– Paused (приостановлен),
– Stopped (остановлен).
● Главное отличие — способ хранения в BackStack.
● Особые callback-методы фрагмента:
– onAttach()
– onCreateView()
– onActivityCreated()
![Page 9: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/9.jpg)
18:45 9 из 50
![Page 10: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/10.jpg)
18:45 10 из 50
Добавление интерфейса
● Интерфейс создается в onCreateView().
● Можно использовать LayoutInflater.
● Обязательно вернуть View (можно и null :) )
![Page 11: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/11.jpg)
18:45 11 из 50
Добавление интерфейса
● Интерфейс создается в onCreateView().
● Можно использовать LayoutInflater.
● Обязательно вернуть View (можно и null :) )
● Параметры метода inflate(int, ViewGroup, boolean):
– id шаблона для fragment;
– container, в который будет помещён fragment;
– надо ли привязывать шаблон к container.
![Page 12: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/12.jpg)
18:45 12 из 50
Добавление фрагментов в activity
● Статичное — xml шаблон activity:
![Page 13: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/13.jpg)
18:45 13 из 50
Добавление фрагментов в activity
● Статичное — xml шаблон activity:
– Для идентификации fragment необходим ID:● android:id● android:tag● или id контейнера (назначает система)
![Page 14: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/14.jpg)
18:45 14 из 50
Добавление фрагментов в activity
● Статичное — xml шаблон activity
● Динамическое — из кода activity:
– Получить доступ к FragmentManager.
– Выполнить FragmentTransaction.
– add(Fragment, String);
– не вызывается onCreateView().
![Page 15: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/15.jpg)
18:45 15 из 50
Управление фрагментами
● getFragmentManager() в activity.
● Получить доступ к созданным ранее fragment:
– findFragmentByID();
– findFragmentByTag();
● Убрать последний fragment из BackStack:
– popBackStack();● Добавить обработчик BackStack:
– addBackStackChangeListener();
![Page 16: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/16.jpg)
18:45 16 из 50
Операции с фрагментами
● beginTransaction() у FragmentManager.
● Набор изменений — одна операция (transaction).
● Возможные изменения:
– add()
– remove()
– replace()● Завершение операции методом commit().
● Сохранение операций в BackStack.
– addToBackStack().
![Page 17: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/17.jpg)
18:45 17 из 50
Операции с фрагментами
// Создание нового фрагмента и операции
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Заменяем всё, чтобы не находилось в fragment_container
// новым фрагментом и добавляем в BackStack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Совершаем операцию
transaction.commit();
![Page 18: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/18.jpg)
18:45 18 из 50
Взаимодействие с фрагментами
● В фрагменте: getActivity().
● В activity: getFragmentManager().findFragmentById().
● Передача событий в activity():
![Page 19: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/19.jpg)
18:45 19 из 50
Взаимодействие с activity
public static class FragmentA extends ListFragment {
OnArticleSelectedListener mListener;
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
...
}
![Page 20: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/20.jpg)
18:45 20 из 50
Взаимодействие с activity
![Page 21: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/21.jpg)
ActionBar
![Page 22: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/22.jpg)
18:45 22 из 50
ActionBar
● Значок приложения
● Значки-действия (action item)
● Значок-переполнения (overflow action)
![Page 23: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/23.jpg)
18:45 23 из 50
ActionBar
● Предоставляет удобный способ навигации
● Быстрый доступ к важным действиям
● Добавлен в API Level 11 (Android 3.0)
● Доступен в SupportLibrary (API Level 7)
![Page 24: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/24.jpg)
18:45 24 из 50
Добавление ActionBar
● Activity наследуется от ActionBarActivity
● Наследевание темы приложения от Theme.AppCompat (или ThemeHolo)
● Обращение через getSupportActionBar(); (getActionBar())
![Page 25: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/25.jpg)
18:45 25 из 50
Добавление действий в ActionBar
● Создание xml-файла меню:
![Page 26: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/26.jpg)
18:45 26 из 50
Добавление действий в ActionBar
● Создание xml-файла меню.
● Переопределение метода onCreateOptionsMenu():
![Page 27: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/27.jpg)
18:45 27 из 50
Добавление действий в ActionBar
● Создание xml-файла меню.
● Переопределение метода onCreateOptionsMenu().
● Отображение действия в виде кнопки в ActionBar:
![Page 28: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/28.jpg)
18:45 28 из 50
Обработка нажатий на action items
![Page 29: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/29.jpg)
18:45 29 из 50
Разделенный ActionBar
![Page 30: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/30.jpg)
18:45 30 из 50
Разделенный ActionBar
● Добавить uiOption в AndroidManifest.xml
![Page 31: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/31.jpg)
18:45 31 из 50
«Назад» через значок приложения
● setDisplayHomeAsUpEnabled()
![Page 32: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/32.jpg)
18:45 32 из 50
«Назад» через значок приложения
● setDisplayHomeAsUpEnabled()
● Определить родительскую activity в AndroidManifest()
![Page 33: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/33.jpg)
18:45 33 из 50
«Назад» через значок приложения
![Page 34: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/34.jpg)
18:45 34 из 50
Вкладки в ActionBar
● Подстраиваются под размер экрана
● Удобнее, чем TabView.
![Page 35: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/35.jpg)
18:45 35 из 50
Вкладки в ActionBar
● Необходим контейнер (ViewGroup) в шаблоне
● setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
● Реализовать ActionBar.TabListener
● Создать ActionBar.Tab
● Добавить в ActionBar - add()
![Page 36: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/36.jpg)
18:45 36 из 50
Вкладки в ActionBar
![Page 37: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/37.jpg)
18:45 37 из 50
Вкладки в ActionBar
![Page 38: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/38.jpg)
18:45 38 из 50
Ещё больше возможностей ActionBar
● Добавление Action View
![Page 39: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/39.jpg)
18:45 39 из 50
Ещё больше возможностей ActionBar
● Добавление Action View● Добавление Action Provider
![Page 40: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/40.jpg)
18:45 40 из 50
Ещё больше возможностей ActionBar
● Добавление Action View● Добавление Action Provider● Добавление выпадающих списков (Drop-down)
![Page 41: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/41.jpg)
Drawer
![Page 42: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/42.jpg)
18:45 42 из 50
Drawer
![Page 43: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/43.jpg)
18:45 43 из 50
Создание Drawer
● Создать шаблон с DrawerLayout
![Page 44: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/44.jpg)
18:45 44 из 50
Создание Drawer
● Создать шаблон с DrawerLayout
● Инициализировать список элементов Drawer
![Page 45: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/45.jpg)
18:45 45 из 50
Создание Drawer
![Page 46: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/46.jpg)
18:45 46 из 50
Создание Drawer
● Создать шаблон с DrawerLayout
● Инициализировать список элементов Drawer
● Обрабатывать нажатия на элементы списка
![Page 47: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/47.jpg)
18:45 47 из 50
Создание Drawer
![Page 48: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/48.jpg)
18:45 48 из 50
Открытие и закрытие Drawer
● Реализовать DrawerLayout.DrawerListener или ActionBarDrawerToggle
![Page 49: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/49.jpg)
18:45 49 из 50
Открытие и закрытие Drawer
● Реализовать DrawerLayout.DrawerListener или ActionBarDrawerToggle
● setDrawerListener()
![Page 50: Лекция Android. Fragments, ActionBar, Drawer](https://reader034.fdocuments.in/reader034/viewer/2022052617/5479307bb4af9fb4158b4771/html5/thumbnails/50.jpg)
18:45 50 из 50
Открытие и закрытие Drawer