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 25. Классы Looper, Handler и HandlerThread После загрузки и разбора JSON-контента с сайта Flickr нашей
следующей задачей станет загрузка и вывод изображений. В
этой главе вы научитесь использовать классы
Looper
,
Handler
и
HandlerThread
для динамической загрузки и вывода
фотографий в PhotoGallery. В этой главе вы разберетесь в том,
для каких задач предназначен основной поток, а для каких —
фоновые потоки. Наконец, вы узнаете, как передавать данные
между основным и фоновым потоками.
Подготовка RecyclerView к выводу изображений Текущая реализация
PhotoHolder
в
PhotoGalleryFragment
просто предоставляет ви джеты
TextView
для вывода объектом
GridLayoutManager
компонента
RecyclerView
. В каждом
представлении
TextView
выводится содержимое заголовка
GalleryItem
.
Для вывода фотографий внесите изменения в
PhotoHolder
,
чтобы вместо текстовых представлений предоставлялись
ImageView
. В конечном итоге
ImageView
выведет
фотографию,
загруженную
в
поле
url
экземпляра
GalleryItem
.
Начнем с создания нового файла макета для элементов
фотогалереи в файле
list_item_gallery.xml
. Макет будет
состоять из единственного виджета
ImageView
(листинг 25.1).
Листинг 25.1. Макет элементов галереи (res/layout/list_item_gallery.xml)
xmlns:android="http://schemas.android.com/apk/r es/android" android:layout_width="match_parent" android:layout_height="120dp" android:layout_gravity="center" android:scaleType="centerCrop"/> Эти виджеты
ImageView
находятся под управлением
экземпляра
GridLayoutManager
компонента
RecyclerView
,
что означает, что их ширина будет величиной переменной. При
этом высота будет оставаться фиксированной. Чтобы наиболее
эффективно использовать пространство виджета
ImageView
,
следует задать его свойству
scaleType
значение
centerCrop
.
С этим значением изображение выравнивается по центру и
масштабируется, чтобы меньшая сторона была равна размеру
представления, а большая усекалась с обеих сторон.
Также измените код класса
PhotoHolder
, чтобы вместо
TextView
он содержал
ImageView
. Замените
bindTitle
функцией, назначающей объект
Drawable
виджету
ImageView
.