Элемент Toolbar предназначен для быстрого и удобного доступа пользователя к часто используемым функциям. Создать его можно используя как упрощённый вариант, в котором о многом уже позаботились разработчики системы Android, так и полностью управляя всеми внутренними компонентами. В данном уроке мы рассмотрим упрощённый вариант.
На главном экране приложения с детальной информацией о пользователе нам необходимо создать такой toolbar:
Здесь у нас находится только один элемент: кнопка поиска, которая должна перенаправлять нас на экран для поиска других пользователей.
В ранних версиях Android использовался элемент ActionBar, теперь же его функцию выполняет Toolbar. Важно, использовать Toolbar из пакета android.support.v7.widget, чтобы у нас была совместимость со старыми устройствами (версия Android ниже 5.0).
Поэтому сперва нам необходимо позаботиться о том, чтобы наши экраны не содержали элемент ActionBar по умолчанию. Для этого нам нужно унаследовать главный стиль приложения (находится в файле styles.xml) от необходимого нам Theme.AppCompat.Light.NoActionBar:
styles.xml
<resources>
<!-- Base application theme. -->
<stylename="AppTheme"parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<itemname="colorPrimary">@color/colorPrimary</item>
<itemname="colorPrimaryDark">@color/colorPrimaryDark</item>
<itemname="colorAccent">@color/colorAccent</item>
</style>
<!-- Остальные элементы ниже не изменились -->
</resources>
Теперь необходимо добавить элемент Toolbar в xml-файл activity_user_info.xml. Для этого добавим Toolbar над контейнером RelativeLayout, в котором находится вся информация о пользователе. Также добавим стиль для тулбара, чтобы переиспользовать его на других экранах.
activity_user_info.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"style="@style/Toolbar"/>
<RelativeLayout>
<!-- Весь контент информации о пользователе -->
</RelativeLayout>
</LinearLayout>
styles.xml
<resources>
<!-- Остальные элементы выше не изменились -->
<stylename="Toolbar">
<itemname="android:layout_width">match_parent</item>
<itemname="android:layout_height">?attr/actionBarSize</item>
<!-- <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item> -->
<itemname="android:background">@color/colorPrimary</item>
</style>
<!-- Остальные элементы ниже не изменились -->
</resources>
Атрибуты элемента Toolbar
Остановимся на некоторых атрибутах:
"android:layout_height">?attr/actionBarSize. Здесь мы указываем высоту тулбара. Таким синтаксисом мы можем получить доступ к значению высоты, которая применяется в атрибутах темы. По умолчанию, если мы не переопределяем значение, оно берётся из системного пакета темы support. Это значение лучше использовать, т.к. оно соответствует гайдам дизайна от Google. Подробнее можете изучить на сайте официальной документации.
theme>@style/ThemeOverlay.AppCompat.Dark.ActionBar. Мы пока закомментировали этот атрибут. Объясним его чуть позже более наглядно.
Таким образом, мы добавили в нашу Activity тулбар. Но этого мало. Нам нужно сообщить ей, что мы используем его в качестве замены элемента ActionBar. Это необходимо, чтобы на устройствах со старой версией Android (ниже Android 5.0 (API 21)) наш интерфейс выглядел также, как и на устройства с новой версией. Для этого нам просто нужно вызвать метод ActivitysetSupportActionBar(Toolbar toolbar):
UserInfoActivity.java
publicclassUserInfoActivityextendsAppCompatActivity {
// Остальной код выше не изменилсяprivateToolbar toolbar;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
// Остальной код выше не изменился
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Остальной код ниже не изменился
}
}
Важно, чтобы импорт вашего тулбара выглядел так: import android.support.v7.widget.Toolbar;. Именно тулбар из этого пакета нам и нужен.
Давайте запустим приложение и посмотрим, что получилось:
Видим, что текст в нашем тулбаре отображается тёмным цветом. Это потому что наше приложение по умолчанию использует Light тему Theme.AppCompat.Light.NoActionBar. Эта тема означает, что фоновый цвет будет светлым, а текст – тёмным.
Давайте раскомментируем атрибут тулбара, который указывает, что все его вложенные элементы должны использовать тему Dark. В тёмной теме весь текст будет отображать светлым цветом, а фоновый цвет – тёмным. Помним, что фоновый цвет тулбара мы тоже переопределяем, используя атрибут android:background.
styles.xml
<resources>
<!-- Остальные элементы выше не изменились -->
<stylename="Toolbar">
<itemname="android:layout_width">match_parent</item>
<itemname="android:layout_height">?attr/actionBarSize</item>
<itemname="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
<itemname="android:background">@color/colorPrimary</item>
</style>
<!-- Остальные элементы ниже не изменились -->
</resources>
Запустим приложение, посмотрим, что получилось:
Отлично, двигаемся дальше.
Осталось наполнить наш toolbar содержимым. Т.к. нашему тулбару необходима всего одна кнопка поиска, то мы можем обойтись стандартным способом добавления элементов в тулбар: при помощи Menu (помимо примера ниже также можете ознакомиться с данным уроком).
Скачивание png иконки
Давайте вначале скачаем иконку поиска, которая будет отображаться в menu. Как правило, для создания приложения достаточно пользоваться ресурсами, которые уже для разработчиков подготовил Google. Например, такая ситуация с иконками, которые рекомендует использовать Google. Их можно найти на этом сайте. В данном случае нам необходима иконка поиска, поэтому попробуем её найти, введя в поле поиска search:
Нашли подходящую иконку, выбрали в выпадающем списке тип Android и цвет, а теперь можем скачать .png-файлы. В первую очередь извлекаем архив для удобной работы с файлами. После извлечения архива видим, что в папке res содержится иконка промасштабированная для различных разрешений экранов, поэтому в зависимости от разрешения экрана устройство самостоятельно будет использовать наиболее подходящий ресурс для отображения.
Наша задача – обеспечить приложение иконками для разных разрешений. Подробнее об этом можно почитать в официальной документации.
Таким образом выделяем все папки внутри res (drawable-hdpi, drawable-xhdpi и т.д.), копируем их, потом заходим в проект и вставляем их в папку res нашего приложения. После добавления иконок структура проекта выглядит так:
Т.е. мы скопировали несколько иконок для разных размеров экранов.
Если поменяем тип отображения файлов с Android на Project, то увидим, что физически создалось несколько папок, в каждой из которых лежит png для разного разрешения экрана.
Создание menu
Как мы с вами помним, для создания папки ресурсов menu необходимо нажать правой кнопкой по папке res и выбрать New -> Android resource directory. В появившемся диалоговом окне выбираем Resource type – menu. Все остальные поля заполнятся автоматически такими же значениями:
Нажимаем OK и видим, что папка создалась.
Затем создадим новый файл меню. Для этого правой кнопкой кликаем по папке menu и выбираем варианты New -> Menu resource file. Вводим имя user_info_menu.xml:
Из данного xml-файла можно увидеть, что наша иконка поиска будет всегда видна пользователю (app:showAsAction="always"). Видим, что мы ссылаемся на иконку, которую только что добавили в проект (android:icon="@drawable/ic_search_white_24dp").
Теперь мы можем наполнить содержимым наш Toolbar, переопределив метод onCreateOptionsMenu в Activity. Это стало возможным благодаря тому, что мы вызвали метод setSupportActionBar(toolbar).
Чтобы переопределить какой-то из методов мы можем нажать комбинацию клавиш Ctrl + O. После этого появится окно со всеми методами. Мы можем ввести название метода onCreateOptionsMenu. И выбрать его:
Давайте добавим в метод использование user_info_menu:
UserInfoActivity.java
publicclassUserInfoActivityextendsAppCompatActivity {
// Остальной код выше не изменился@OverridepublicbooleanonCreateOptionsMenu(Menumenu) {
getMenuInflater().inflate(R.menu.user_info_menu, menu);
returntrue;
}
// Остальной код ниже не изменился
}
Отлично, дело за малым: выполнить необходимое нам действие по клику на кнопку – перейти на экран для поиска пользователей:
UserInfoActivity.java
publicclassUserInfoActivityextendsAppCompatActivity {
// Остальной код выше не изменился@OverridepublicbooleanonOptionsItemSelected(MenuItemitem) {
if(item.getItemId() ==R.id.action_search) {
Intent intent =newIntent(this, SearchUsersActivity.class);
startActivity(intent);
}
returntrue;
}
// Остальной код ниже не изменился
}
Единственная вещь, о которой ещё стоит упомянуть – это установка заголовка нашего экрана, отображающегося в тулбаре. Мы хотим устанавливать имя пользователя динамически в методе displayUserInfo. Для этого достаточно вызвать в необходимом месте метод тулбара setTitle(CharSequence title). Помните, что мы вызывали строку setSupportActionBar(toolbar). Также в Activity есть метод getSupportActionBar, который используется для совместимости со старыми устройствами. Его мы и будем использовать. Давайте добавим эту логику в метод displayUserInfo():
UserInfoActivity.java
publicclassUserInfoActivityextendsAppCompatActivity {
privatevoiddisplayUserInfo(Useruser) {
// остальной код выше не изменился
getSupportActionBar().setTitle(user.getName());
}
}
AndroidStudio может подчёркивать вызов getSupportActionBar().setTitle, сообщая, что объект может быть null. Но мы помним, что мы вызвали метод setSupportActionBar(toolbar), поэтому можем пока игнорировать это замечание.
Запустим приложение и посмотрим на результат:
В результате данного урока мы узнали:
что такое элемент Toolbar;
что такое Menu и как его использловать с элементом Toolbar;
каким образом наполнить Toolbar пользовательскими элементами.
Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для
продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.
Код начала урока:
gitzip
Структура урока:
Знакомство с элементом Toolbar
Элемент
Toolbar
предназначен для быстрого и удобного доступа пользователя к часто используемым функциям. Создать его можно используя как упрощённый вариант, в котором о многом уже позаботились разработчики системыAndroid
, так и полностью управляя всеми внутренними компонентами. В данном уроке мы рассмотрим упрощённый вариант.На главном экране приложения с детальной информацией о пользователе нам необходимо создать такой
toolbar
:Здесь у нас находится только один элемент: кнопка поиска, которая должна перенаправлять нас на экран для поиска других пользователей.
В ранних версиях
Android
использовался элементActionBar
, теперь же его функцию выполняетToolbar
. Важно, использоватьToolbar
из пакетаandroid.support.v7.widget
, чтобы у нас была совместимость со старыми устройствами (версия Android ниже 5.0).Поэтому сперва нам необходимо позаботиться о том, чтобы наши экраны не содержали элемент
ActionBar
по умолчанию. Для этого нам нужно унаследовать главный стиль приложения (находится в файлеstyles.xml
) от необходимого намTheme.AppCompat.Light.NoActionBar
:styles.xml
Теперь необходимо добавить элемент
Toolbar
вxml
-файлactivity_user_info.xml
. Для этого добавимToolbar
над контейнеромRelativeLayout
, в котором находится вся информация о пользователе. Также добавим стиль для тулбара, чтобы переиспользовать его на других экранах.activity_user_info.xml
styles.xml
Атрибуты элемента Toolbar
Остановимся на некоторых атрибутах:
"android:layout_height">?attr/actionBarSize
. Здесь мы указываем высоту тулбара. Таким синтаксисом мы можем получить доступ к значению высоты, которая применяется в атрибутах темы. По умолчанию, если мы не переопределяем значение, оно берётся из системного пакета темыsupport
. Это значение лучше использовать, т.к. оно соответствует гайдам дизайна отGoogle
. Подробнее можете изучить на сайте официальной документации.theme>@style/ThemeOverlay.AppCompat.Dark.ActionBar
. Мы пока закомментировали этот атрибут. Объясним его чуть позже более наглядно.Таким образом, мы добавили в нашу
Activity
тулбар. Но этого мало. Нам нужно сообщить ей, что мы используем его в качестве замены элементаActionBar
. Это необходимо, чтобы на устройствах со старой версиейAndroid
(ниже Android 5.0 (API 21)) наш интерфейс выглядел также, как и на устройства с новой версией. Для этого нам просто нужно вызвать методActivity
setSupportActionBar(Toolbar toolbar)
:UserInfoActivity.java
Важно, чтобы импорт вашего тулбара выглядел так:
import android.support.v7.widget.Toolbar;
. Именно тулбар из этого пакета нам и нужен.Давайте запустим приложение и посмотрим, что получилось:
Видим, что текст в нашем тулбаре отображается тёмным цветом. Это потому что наше приложение по умолчанию использует
Light
темуTheme.AppCompat.Light.NoActionBar
. Эта тема означает, что фоновый цвет будет светлым, а текст – тёмным.Давайте раскомментируем атрибут тулбара, который указывает, что все его вложенные элементы должны использовать тему
Dark
. В тёмной теме весь текст будет отображать светлым цветом, а фоновый цвет – тёмным. Помним, что фоновый цвет тулбара мы тоже переопределяем, используя атрибутandroid:background
.styles.xml
Запустим приложение, посмотрим, что получилось:
Отлично, двигаемся дальше.
Осталось наполнить наш
toolbar
содержимым. Т.к. нашему тулбару необходима всего одна кнопка поиска, то мы можем обойтись стандартным способом добавления элементов в тулбар: при помощиMenu
(помимо примера ниже также можете ознакомиться с данным уроком).Скачивание png иконки
Давайте вначале скачаем иконку поиска, которая будет отображаться в
menu
. Как правило, для создания приложения достаточно пользоваться ресурсами, которые уже для разработчиков подготовил Google. Например, такая ситуация с иконками, которые рекомендует использовать Google. Их можно найти на этом сайте. В данном случае нам необходима иконка поиска, поэтому попробуем её найти, введя в поле поискаsearch
:Нашли подходящую иконку, выбрали в выпадающем списке тип Android и цвет, а теперь можем скачать
.png
-файлы. В первую очередь извлекаем архив для удобной работы с файлами. После извлечения архива видим, что в папкеres
содержится иконка промасштабированная для различных разрешений экранов, поэтому в зависимости от разрешения экрана устройство самостоятельно будет использовать наиболее подходящий ресурс для отображения.Наша задача – обеспечить приложение иконками для разных разрешений. Подробнее об этом можно почитать в официальной документации.
Таким образом выделяем все папки внутри
res
(drawable-hdpi
,drawable-xhdpi
и т.д.), копируем их, потом заходим в проект и вставляем их в папкуres
нашего приложения. После добавления иконок структура проекта выглядит так:Т.е. мы скопировали несколько иконок для разных размеров экранов.
Если поменяем тип отображения файлов с
Android
наProject
, то увидим, что физически создалось несколько папок, в каждой из которых лежитpng
для разного разрешения экрана.Создание menu
Как мы с вами помним, для создания папки ресурсов
menu
необходимо нажать правой кнопкой по папкеres
и выбратьNew -> Android resource directory
. В появившемся диалоговом окне выбираемResource type
–menu
. Все остальные поля заполнятся автоматически такими же значениями:Нажимаем
OK
и видим, что папка создалась.Затем создадим новый файл меню. Для этого правой кнопкой кликаем по папке
menu
и выбираем вариантыNew -> Menu resource file
. Вводим имяuser_info_menu.xml
:user_info_menu.xml
Из данного
xml
-файла можно увидеть, что наша иконка поиска будет всегда видна пользователю (app:showAsAction="always"
). Видим, что мы ссылаемся на иконку, которую только что добавили в проект (android:icon="@drawable/ic_search_white_24dp"
).Теперь мы можем наполнить содержимым наш
Toolbar
, переопределив методonCreateOptionsMenu
вActivity
. Это стало возможным благодаря тому, что мы вызвали методsetSupportActionBar(toolbar)
.Чтобы переопределить какой-то из методов мы можем нажать комбинацию клавиш
Ctrl + O
. После этого появится окно со всеми методами. Мы можем ввести название методаonCreateOptionsMenu
. И выбрать его:Давайте добавим в метод использование
user_info_menu
:UserInfoActivity.java
Отлично, дело за малым: выполнить необходимое нам действие по клику на кнопку – перейти на экран для поиска пользователей:
UserInfoActivity.java
Единственная вещь, о которой ещё стоит упомянуть – это установка заголовка нашего экрана, отображающегося в тулбаре. Мы хотим устанавливать имя пользователя динамически в методе
displayUserInfo
. Для этого достаточно вызвать в необходимом месте метод тулбараsetTitle(CharSequence title)
. Помните, что мы вызывали строкуsetSupportActionBar(toolbar)
. Также вActivity
есть методgetSupportActionBar
, который используется для совместимости со старыми устройствами. Его мы и будем использовать. Давайте добавим эту логику в методdisplayUserInfo()
:UserInfoActivity.java
AndroidStudio
может подчёркивать вызовgetSupportActionBar().setTitle
, сообщая, что объект может бытьnull
. Но мы помним, что мы вызвали методsetSupportActionBar(toolbar)
, поэтому можем пока игнорировать это замечание.Запустим приложение и посмотрим на результат:
В результате данного урока мы узнали:
Toolbar
;Menu
и как его использловать с элементомToolbar
;Toolbar
пользовательскими элементами.Ссылки:
Полезные материалы:
Полный листинг изменений кода:
Code diff