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
Листинг 29.9. Загрузка URL в WebView (PhotoPageFragment.kt)
class PhotoPageFragment : VisibleFragment() {
...
@SuppressLint("SetJavaScriptEnabled")
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val
view
=
inflater.inflate(R.layout.fragment_photo_page,
container, false)
webView
=
view.findViewById(R.id.web_view)
webView.settings.javaScriptEnabled =
true
webView.webViewClient = WebViewClient()
webView.loadUrl(uri.toString())
return view
}
...
}
Загрузка данных с URL-адреса должна происходить после
настройки
WebView
, поэтому она выполняется в последнюю
очередь. До этого мы включаем JavaScript, обращаясь к свойству
settings
для получения экземпляра
WebSettings
, с
последующей
установкой
WebSettings.javaScriptEnabled=true
.
Объект
WebSettings
— первый из трех механизмов настройки
WebView
. Он содержит различные свойства, которые можно
задать в коде, например строку пользовательского агента и
размер текста.
После этого реализация
WebViewClient
добавляется к
WebView
. Чтобы понять, для чего это нужно, сначала
посмотрим, что произойдет без
WebViewClient
.
Новый URL-адрес может загружаться двумя разными
способами: страница может приказать вам перейти по другому
URL-адресу (перенаправление), или же вы можете щелкнуть на
ссылке. Без
WebViewClient
виджет
WebView
предложит
менеджеру activity найти подходящую activity для загрузки
нового URL.
Но это совсем не то, что нам нужно. Многие сайты (включая
страницы с фотографиями Flickr) при загрузке в браузере на
телефоне немедленно перенаправляют пользователя на
мобильную версию того же сайта. Нет особого смысла создавать
собственное представление страницы, если все равно все
кончится инициированием неявного интента.
С другой стороны, если вы предоставите собственную
реализацию
WebViewClient
для своего виджета
WebView
,
процесс выглядит иначе. Вместо того чтобы обращаться за
помощью к менеджеру activity, виджет обращается к вашей
реализации
WebViewClient
. А реализация
WebViewClient
по
умолчанию говорит: «Загрузи URL самостоятельно!» И страница
появится в вашем виджете
WebView
.
Запустите приложение PhotoGallery, и вы увидите
WebView
на экране (как справа на рис. 29.1).
Do'stlaringiz bilan baham: |