name="AppTheme"
parent="
Theme.AppCompat.Light.DarkActionBar
">
name="colorPrimary">@color/colorPrimary
name="colorPrimaryDark">@color/colorPrimaryDark
name="colorAccent">@color/colorAccent
name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
name="StrongBeatBoxButton"
parent="@style/BeatBoxButton">
- bold
name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
...
name="AppTheme"
parent="Theme.AppCompat
.Light.DarkActionBar
">
...
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/
colorPrimaryred<
/item>
name="colorPrimaryDark">@color/
colorPrimary
Darkdark_red
name="colorAccent">@color/
colorAccentgray
item>
name="Theme.AppCompat"
parent="Base.Theme.AppCompat" />
Тема
Theme.AppCompat
наследует
атрибуты
от
Base.Theme.AppCompat
. Интересно, что
Theme.AppCompat
не
переопределяет никакие атрибуты, а только содержит ссылку
на своего родителя.
Щелкните мышью по
Base.Theme.AppCompat
с нажатой
клавишей (
Ctrl
). Android Studio сообщит, что тема уточняется
по ресурсам. Существует несколько разных версий этой темы в
зависимости от используемой версии Android.
name="Base.Theme.AppCompat"
parent="Base.V7.Theme.AppCompat">
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">
-
androidx.appcompat.app.AppCompatVie
wInflater
- false
- true
name="windowActionBarOverlay">false
name="Platform.AppCompat"
parent="android:Theme.Holo">
name="android:windowNoTitle">true
name="android:windowActionBar">false
- ?
attr/buttonBarStyle
- ?
attr/buttonBarButtonStyle
name="android:borderlessButtonStyle">?
attr/borderlessButtonStyle
...
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
...
name="android:windowBackground">@color/backgrou
nd_material_dark
name="AppTheme"
parent="Theme.AppCompat">
- @color/red
name="colorPrimaryDark">@color/dark_red
- @color/gray
-
name="android:windowBackground">@color/soothing
_blue
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">
...
name="buttonStyle">@style/Widget.AppCompat.Butt
on
name="buttonStyleSmall">@style/Widget.AppCompat
.Button.Small
...
name="Widget.AppCompat.Button"
parent="Base.Widget.AppCompat.Button"/>
Стиль
Widget.AppCompat.Button
самостоятельно никакие
атрибуты не определяет. Чтобы просмотреть его содержимое,
перейдите к его родителю. Вы увидите, что базовый стиль
существует
в
двух
версиях.
Выберите
версию
values/values.xml
.
name="Base.Widget.AppCompat.Button"
parent="android:Widget">
name="android:background">@drawable/abc_btn_def
ault_mtrl_shape
- ?
android:attr/textAppearanceButton
- 48dip
- 88dip
- true
- true
name="android:gravity">center_vertical|center_h
orizontal
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red
name="colorPrimaryDark">@color/dark_red
name="colorAccent">@color/gray
name="android:windowBackground">@color/soothing
_blue
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@color/dark_bluem>
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@drawable/button_beat
_box_normal
-
name="android:background">@drawable/button_beat
_box
26. Поиск: SearchView и SharedPreferences
Следующим шагом в работе над приложением PhotoGallery
станет поиск фотографий на Flickr. В этой главе вы узнаете, как
правильно
интегрировать
поиск
в
приложение
с
использованием
SearchView
.
SearchView
—
класс
представления действия (action view) — представления, которое
может быть встроено прямо в
Toolbar
.
Пользователь нажимает на
SearchView
, вводит запрос и
отправляет его. Flickr проводит поиск введенной строки с
использованием поискового API и заполняет
RecyclerView
полученными результатами (рис. 26.1). Отправленная строка
запроса сохраняется в файловой системе. Это означает, что
последний запрос пользователя «переживет» перезапуск
приложения и даже устройства.
Рис. 26.1. Внешний вид приложения
Поиск во Flickr
Начнем с того, что нужно сделать на стороне Flickr. Для
выполнения поиска во Flickr следует вызвать метод
flickr.photos.search
. Вот как выглядит запрос GET для
поиска текста «cat»:
https://api.flickr.com/services/rest/?
method=flickr.photos.search
&api_key=xxx&format=json&nojsoncallback=1&extra
s=url_s&safe_search=1&text=cat
В методе используется значение
flickr.photos.search
.
Параметр
text
определяет условия поиска («
cat
» в данном
случае). Присваивание свойству
safesearch
значения
1
позволит отфильтровать из поиска оскорбительные результаты.
Некоторые из пар «параметр — значение», такие как
format=json
,
являются
постоянными
как
для
flickr.photo.search
,
так
и
для
flickr.interestingness.getList
.
Нам
нужно
абстрагировать эти пары общих параметров-значений в
перехватчик. Перехватчик делает то, что следует из названия,
— он перехватывает запрос или ответ и позволяет вам
манипулировать содержимым или совершать какие-то
действия до завершения запроса или ответа.
Создайте
новый
класс
Interceptor
с
именем
PhotoInterceptor
в папке
api
. Переопределите функцию
intercept(chain)
на доступ к запросу, добавьте в нее пары
«параметр — значение» и перезапишите исходный URL-адрес.
(Не забудьте использовать ваш API-ключ, который вы создали в
главе 24, вместо значения вашApiКлюч. Вы можете скопировать
его из файла
api/FlickrApi.kt
.)
Do'stlaringiz bilan baham: |