Здесь стандартным меню не обойтись, т.к. здесь уже присутствует более сложная логика пользовательского интерфейса – элемент поиска. Поэтому нам понадобится файл toolbar_search_user.xml, который мы создавали в одном из прошлых уроков.
Сперва, как и с предыдущим тулбаром в файле activity_user_info.xml, добавим его в файл activity_search_users.xml:
Мы изменили корневой элемент с FrameLayout на LinearLayout, т.к. у нас появился второй вложенный элемент. Мы указали свойство android:orientation="vertical", чтобы элементы располагались вертикально.
А теперь просто добавим содержимое файла toolbar_search_user.xml (немного его изменив) внутрь элемента Toolbar. Toolbar является ViewGroup, поэтому в него можно помещать элементы, как и в любой другой контейнер. Единственный нюанс – Toolbar располагает элементы один над одним по умолчанию (как FrameLayout).
Единственное, что изменилось – атрибут android:layout_height="match_parent" у контейнера RelativeLayout. Т.к. нам необходимо, чтобы контейнер занимал всю высоту parent элемента (им является Toolbar).
Запустим приложение и перейдём на экран поиска пользователей:
Видим, что данные отобразились, но визуально они выглядят не очень.
Стилизация Toolbar-компонента
Нам надо поменять стили у наших элементов EditText и Button.
android:maxLines="1" – означает, что EditText не будет поддерживать многострочный режим и весь текст будет располагаться в одну строку.
android:imeOptions="actionSearch" и android:inputType="text" добавляют в клавиатуру пользователя кнопку поиска, нажатие по которой в дальнейшем мы сможем обработать.
android:background="@null" убирает нижнюю линию, которая по умолчанию присутствует в EditText.
Также некоторые изменения претерпела кнопка поиска.
Добавление иконки шрифта Ionicons
Перед тем, как добавить кнопку, нам необходимо по аналогии со шрифтом font_awesome в проект добавить шрифт ionicons.
После этого нам нужно добавить строковый ресурс иконки поиска, которая располагается на сайте. Найти её можно используя название ion-android-search. После того, как нашли её, необходимо скопировать иконку, которая находится в блоке selectable, как показано на скриншоте:
Затем просто создаём новый строковый ресурс с именем ion_search и вставляем то значение, которое мы скопировали:
strings.xml
<resources>
<!-- Остальные элементы выше не изменились -->
<stringname="ion_search"></string>
</resources>
Мы установили атрибутам значение minWidth, minHeight0dp, т.к. по умолчанию кнопки в Android системе имеют минимальную ширину и высоту. В данном случае нам это мешает, поэтому мы переопределяем эти значения.
Также мы используем атрибут android:background="@drawable/transparent_gfx". Пользовательский интерфейс должен быть интуитивно понятен для пользователя, поэтому он должен показывать некую реакцию на действия пользователя. В данном случае при нажатии на кнопку поиска её фон должен видоизменяться, тем самым показывая отзывчивость кнопки на действия пользователя. Более подробно об этом эффекте можно узнать из отрывка курсаMaterial Design в Android. Ниже приведены файлы эффекта:
Нам нужно создать файл с названием transparent_gfx в папке drawable. Для этого кликните по папке правой кнопкой, выбрав элементы New -> Drawable resource file.
Теперь мы можем работать с элементами тулбара как и с любыми другими элементами экрана. Давайте добавим Toolbar и его вложенные элементы в SearchUsersActivity.
SearchUsersActivity.java
publicclassSearchUsersActivityextendsAppCompatActivity {
// остальные элементы выше не изменилисьprivateToolbar toolbar;
privateEditText queryEditText;
privateButton searchButton;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_users);
initRecyclerView();
toolbar = findViewById(R.id.toolbar);
queryEditText = toolbar.findViewById(R.id.query_edit_text);
searchButton = toolbar.findViewById(R.id.search_button);
searchUsers();
}
// остальные элементы ниже не изменились
}
Ничего необычного. Только вложенные элементы мы ищем используя toolbar.findViewById(). Это сделано для оптимизации поиска элементов. Поиск будет проходить только внутри Toolbar элемента, а не во всех элементах SearchUsersActivity.
Теперь давайте будем производить поиск пользователей не в методе onCreate, а добавим слушателей на нажатие кнопки поиска и на нажатие кнопки search внутри клавиатуры:
SearchUsersActivity.java
publicclassSearchUsersActivityextendsAppCompatActivity {
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
// остальной код выше не изменился
searchButton.setOnClickListener(newView.OnClickListener() {
@OverridepublicvoidonClick(Viewv) {
searchUsers();
}
});
queryEditText.setOnEditorActionListener(newTextView.OnEditorActionListener() {
@OverridepublicbooleanonEditorAction(TextViewv, intactionId, KeyEventevent) {
if (actionId ==EditorInfo.IME_ACTION_SEARCH) {
searchUsers();
returntrue;
}
returnfalse;
}
});
}
}
Если вы сейчас запустите приложение, то не увидите в тулбаре кнопки «Назад» в левой его части. Её мы можем добавить, используя стандартный механизм тулбара:
SearchUsersActivity.java
publicclassSearchUsersActivityextendsAppCompatActivity {
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
// остальной код выше не изменился
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@OverridepublicbooleanonOptionsItemSelected(MenuItemitem) {
switch (item.getItemId()) {
caseandroid.R.id.home:
onBackPressed();
returntrue;
}
returnsuper.onOptionsItemSelected(item);
}
}
Таким образом, мы сообщаем Activity о необходимости отобразить кнопку «Назад». По умолчанию кнопка назад не будет работать. Мы хотим, чтобы она работала как аппаратная кнопка «Назад». Для этого мы перехватываем нажатием кнопки в тулбаре и вызываем метод ActivityonBackPressed().
Посмотрим, что у нас получилось в итоге:
.
Проблема повторения элементов в списке
У нас появилась небольшая проблема: если мы несколько раз нажмём на кнопку поиска, то элементы в списке будут повторяться. Для избежания этой проблемы мы можем при каждом вызове метода searchUsers удалять старые элементы из адаптера. Давайте так и сделаем:
SearchUsersActivity.java
publicclassSearchUsersActivityextendsAppCompatActivity {
// Остальной код выше не изменилсяprivatevoidsearchUsers() {
Collection<User> users = getUsers();
usersAdapter.clearItems();
usersAdapter.setItems(users);
}
// Остальной код ниже не изменился
}
Проблема решена. Можете запустить приложение и убедиться в этом.
Отлично, поздравляем вас!
Кстати, мы можем удалить файл toolbar_search_user.xml, т.к. он нам больше не понадобится.
В результате данного урока мы:
отработали навыки работы с Toolbar;
узнали, каким образом наполнить Toolbar пользовательскими элементами.
Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для
продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.
Код начала урока:
gitzip
Структура урока:
Нам необходимо сделать тулбар такого вида:
Добавление Toolbar-компонента
Здесь стандартным меню не обойтись, т.к. здесь уже присутствует более сложная логика пользовательского интерфейса – элемент поиска. Поэтому нам понадобится файл
toolbar_search_user.xml
, который мы создавали в одном из прошлых уроков.Сперва, как и с предыдущим тулбаром в файле
activity_user_info.xml
, добавим его в файлactivity_search_users.xml
:activity_search_users.xml
Мы изменили корневой элемент с
FrameLayout
наLinearLayout
, т.к. у нас появился второй вложенный элемент. Мы указали свойствоandroid:orientation="vertical"
, чтобы элементы располагались вертикально.А теперь просто добавим содержимое файла
toolbar_search_user.xml
(немного его изменив) внутрь элементаToolbar
.Toolbar
являетсяViewGroup
, поэтому в него можно помещать элементы, как и в любой другой контейнер. Единственный нюанс –Toolbar
располагает элементы один над одним по умолчанию (какFrameLayout
).activity_search_users.xml
Единственное, что изменилось – атрибут
android:layout_height="match_parent"
у контейнераRelativeLayout
. Т.к. нам необходимо, чтобы контейнер занимал всю высотуparent
элемента (им являетсяToolbar
).Запустим приложение и перейдём на экран поиска пользователей:
Видим, что данные отобразились, но визуально они выглядят не очень.
Стилизация Toolbar-компонента
Нам надо поменять стили у наших элементов
EditText
иButton
.Давайте усовершенствуем наш
EditText
:activity_search_users.xml
Объясним новые атрибуты:
android:maxLines="1"
– означает, чтоEditText
не будет поддерживать многострочный режим и весь текст будет располагаться в одну строку.android:imeOptions="actionSearch"
иandroid:inputType="text"
добавляют в клавиатуру пользователя кнопку поиска, нажатие по которой в дальнейшем мы сможем обработать.android:background="@null"
убирает нижнюю линию, которая по умолчанию присутствует вEditText
.Также некоторые изменения претерпела кнопка поиска.
Добавление иконки шрифта Ionicons
Перед тем, как добавить кнопку, нам необходимо по аналогии со шрифтом
font_awesome
в проект добавить шрифтionicons
.После этого нам нужно добавить строковый ресурс иконки поиска, которая располагается на сайте. Найти её можно используя название
ion-android-search
. После того, как нашли её, необходимо скопировать иконку, которая находится в блокеselectable
, как показано на скриншоте:Затем просто создаём новый строковый ресурс с именем
ion_search
и вставляем то значение, которое мы скопировали:strings.xml
Видим, что иконка отобразилась корректно.
Вот как выглядит наша кнопка со всеми атрибутами:
activity_search_users.xml
Мы установили атрибутам значение
minWidth
,minHeight
0dp
, т.к. по умолчанию кнопки вAndroid
системе имеют минимальную ширину и высоту. В данном случае нам это мешает, поэтому мы переопределяем эти значения.Также мы используем атрибут
android:background="@drawable/transparent_gfx"
. Пользовательский интерфейс должен быть интуитивно понятен для пользователя, поэтому он должен показывать некую реакцию на действия пользователя. В данном случае при нажатии на кнопку поиска её фон должен видоизменяться, тем самым показывая отзывчивость кнопки на действия пользователя. Более подробно об этом эффекте можно узнать из отрывка курсаMaterial Design в Android
. Ниже приведены файлы эффекта:Нам нужно создать файл с названием
transparent_gfx
в папкеdrawable
. Для этого кликните по папке правой кнопкой, выбрав элементыNew -> Drawable resource file
.drawable/transparent_gfx.xml
Обработка событий Toolbar-компонента
Теперь мы можем работать с элементами тулбара как и с любыми другими элементами экрана. Давайте добавим
Toolbar
и его вложенные элементы вSearchUsersActivity
.SearchUsersActivity.java
Ничего необычного. Только вложенные элементы мы ищем используя
toolbar.findViewById()
. Это сделано для оптимизации поиска элементов. Поиск будет проходить только внутриToolbar
элемента, а не во всех элементахSearchUsersActivity
.Теперь давайте будем производить поиск пользователей не в методе
onCreate
, а добавим слушателей на нажатие кнопки поиска и на нажатие кнопкиsearch
внутри клавиатуры:SearchUsersActivity.java
Если вы сейчас запустите приложение, то не увидите в тулбаре кнопки «Назад» в левой его части. Её мы можем добавить, используя стандартный механизм тулбара:
SearchUsersActivity.java
Таким образом, мы сообщаем
Activity
о необходимости отобразить кнопку «Назад». По умолчанию кнопка назад не будет работать. Мы хотим, чтобы она работала как аппаратная кнопка «Назад». Для этого мы перехватываем нажатием кнопки в тулбаре и вызываем методActivity
onBackPressed()
.Посмотрим, что у нас получилось в итоге:
.
Проблема повторения элементов в списке
У нас появилась небольшая проблема: если мы несколько раз нажмём на кнопку поиска, то элементы в списке будут повторяться. Для избежания этой проблемы мы можем при каждом вызове метода
searchUsers
удалять старые элементы из адаптера. Давайте так и сделаем:SearchUsersActivity.java
Проблема решена. Можете запустить приложение и убедиться в этом.
Отлично, поздравляем вас!
Кстати, мы можем удалить файл
toolbar_search_user.xml
, т.к. он нам больше не понадобится.В результате данного урока мы:
Toolbar
;Toolbar
пользовательскими элементами.Ссылки:
Полезные материалы:
Полный листинг изменений кода:
Code diff