Совместимость панели инструментов
Обзор
В этом разделе объясняется, как использовать Toolbar
версии Android ранее, чем Android 5.0 Lollipop. Если приложение не поддерживает версии Android ранее, чем Android 5.0, можно пропустить этот раздел.
Так как Toolbar
она входит в библиотеку поддержки Android версии 7, ее можно использовать на устройствах с Android 2.1 (уровень API 7) и более поздних версий. Однако необходимо установить библиотеку поддержки Android версии 7 AppCompat NuGet и изменить код, чтобы он использовал Toolbar
реализацию, предоставленную в этой библиотеке. В этом разделе объясняется, как установить этот NuGet и изменить приложение ToolbarFun из добавления второй панели инструментов , чтобы оно выполнялось в версиях Android раньше, чем Lollipop 5.0.
Чтобы изменить приложение для использования версии панели инструментов AppCompat, выполните следующие действия.
Задайте минимальные и целевые версии Android для приложения.
Установите пакет NuGet AppCompat.
Используйте тему AppCompat вместо встроенной темы Android.
Измените его
MainActivity
таким образом, чтобы он неActivity
был подклассамиAppCompatActivity
.
Каждый из этих шагов подробно описан в следующих разделах.
Установка минимальной и целевой версии Android
Целевая платформа приложения должна быть установлена на уровне API 21 или больше, или приложение не будет развернуто должным образом. Если при развертывании приложения отображается ошибка, например без идентификатора ресурса для атрибута "tileModeX" в пакете "android" , это связано с тем, что целевая платформа не задана для Android 5.0 (уровень API 21 — Lollipop) или больше.
Задайте для целевой платформы значение API уровня 21 или выше и задайте параметры проекта уровня API Android минимальной версии Android, поддерживаемой приложением. Дополнительные сведения о настройке уровней API Android см. в разделе "Общие сведения об уровнях API Android".
ToolbarFun
В примере для минимальной версии Android задано значение KitKat (уровень API 4.4).
Установка пакета NuGet AppCompat
Затем добавьте пакет AppCompat библиотеки поддержки Android версии 7 в проект. В Visual Studio щелкните правой кнопкой мыши ссылки и выберите пункт "Управление пакетами NuGet...". Нажмите кнопку "Обзор" и найдите библиотеку поддержки Android версии 7 AppCompat. Выберите Xamarin.Android.Support.v7.AppCompat и нажмите кнопку Установить:
При установке NuGet также устанавливаются несколько других пакетов NuGet, если они еще не присутствуют (например, Xamarin.Android.Support.Animated.Vector.Drawable, Xamarin.Android.Support.v4 и Xamarin.Android.Support.Vector.Drawable). Дополнительные сведения об установке пакетов NuGet см. в пошаговом руководстве. Включение NuGet в проект.
Использование темы и панели инструментов AppCompat
Библиотека AppCompat поставляется с несколькими Theme.AppCompat
темами, которые можно использовать в любой версии Android, поддерживаемой библиотекой AppCompat. Пример ToolbarFun
темы приложения является производным от Theme.Material.Light.DarkActionBar
, который недоступен в версиях Android, предшествующих Lollipop. ToolbarFun
Поэтому необходимо адаптировать для использования аналога AppCompat для этой темыTheme.AppCompat.Light.DarkActionBar
. Кроме того, поскольку Toolbar
он недоступен в версиях Android до Lollipop, необходимо использовать версию Toolbar
AppCompat. Поэтому макеты должны использоваться android.support.v7.widget.Toolbar
вместо Toolbar
.
Обновление макетов
Измените resources/layout/Main.axml и замените Toolbar
элемент следующим XML:
<android.support.v7.widget.Toolbar
android:id="@+id/edit_toolbar"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorAccent"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Измените ресурсы, макет или toolbar.xml и замените его содержимое следующим XML-кодом:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
Обратите внимание, что значения больше не префиксированы android:
(напомним, ?attr
что ?
нотация ссылается на ресурс в текущей теме). Если ?android:attr
бы он по-прежнему использовался здесь, Android будет ссылать на значение атрибута из текущей запущенной платформы, а не из библиотеки AppCompat. Так как в этом примере используется actionBarSize
библиотека AppCompat, android:
префикс удаляется. Аналогичным образом изменяется, @android:style
чтобы android:theme
атрибут был задан на тему в библиотеке AppCompat— ThemeOverlay.AppCompat.Dark.ActionBar
тема используется здесь, а не ThemeOverlay.Material.Dark.ActionBar
.@style
Обновление стиля
Измените ресурсы/значения/styles.xml и замените его содержимое следующим XML-кодом:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<style name="MyTheme" parent="MyTheme.Base"> </style>
<style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="colorPrimary">#5A8622</item>
<item name="colorAccent">#A88F2D</item>
</style>
</resources>
Имена элементов и родительская тема в этом примере больше не префиксированы, android:
так как мы используем библиотеку AppCompat.
Кроме того, родительская тема изменяется на версию Light.DarkActionBar
AppCompat.
Меню обновления
Для поддержки более ранних версий Android библиотека AppCompat использует пользовательские атрибуты, которые зеркало атрибуты android:
пространства имен. Однако некоторые атрибуты (например, атрибут, showAsAction
используемый <menu>
в теге) не существуют в платформе Android на старых устройствах— showAsAction
в API Android 11, но недоступны в API Android 7. По этой причине настраиваемое пространство имен должно использоваться для префикса всех атрибутов, определенных библиотекой поддержки. В файлах ресурсов меню вызывается local
пространство имен для префикса атрибута showAsAction
.
Измените ресурсы, меню или top_menus.xml и замените его содержимое следующим XML-кодом:
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_edit"
android:icon="@mipmap/ic_action_content_create"
local:showAsAction="ifRoom"
android:title="Edit" />
<item
android:id="@+id/menu_save"
android:icon="@mipmap/ic_action_content_save"
local:showAsAction="ifRoom"
android:title="Save" />
<item
android:id="@+id/menu_preferences"
local:showAsAction="never"
android:title="Preferences" />
</menu>
Пространство имен добавляется с помощью следующей local
строки:
xmlns:local="http://schemas.android.com/apk/res-auto">
Атрибут showAsAction
предопределен этим local:
пространством имен, а не android:
local:showAsAction="ifRoom"
Аналогичным образом измените ресурсы или меню/edit_menus.xml и замените его содержимое следующим XML-кодом:
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_cut"
android:icon="@mipmap/ic_menu_cut_holo_dark"
local:showAsAction="ifRoom"
android:title="Cut" />
<item
android:id="@+id/menu_copy"
android:icon="@mipmap/ic_menu_copy_holo_dark"
local:showAsAction="ifRoom"
android:title="Copy" />
<item
android:id="@+id/menu_paste"
android:icon="@mipmap/ic_menu_paste_holo_dark"
local:showAsAction="ifRoom"
android:title="Paste" />
</menu>
Как этот коммутатор пространства имен обеспечивает поддержку атрибута showAsAction
в версиях Android до уровня 11 API? Настраиваемый атрибут showAsAction
и все возможные значения включаются в приложение при установке AppCompat NuGet.
Подкласс AppCompatActivity
Последним шагом преобразования является изменение MainActivity
таким образом, чтобы он был подклассом AppCompatActivity
. Измените MainActivity.cs и добавьте следующие using
инструкции:
using Android.Support.V7.App;
using Toolbar = Android.Support.V7.Widget.Toolbar;
Это объявляется Toolbar
версией Toolbar
AppCompat. Затем измените определение MainActivity
класса:
public class MainActivity : AppCompatActivity
Чтобы задать панель действий версии AppCompat Toolbar
, замените вызов SetActionBar
на SetSupportActionBar
. В этом примере заголовок также изменяется, чтобы указать, что используется версия Toolbar
AppCompat:
SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";
Наконец, измените минимальный уровень Android на значение pre-Lollipop, которое должно поддерживаться (например, API 19).
Создайте приложение и запустите его на устройстве до Lollipop или эмуляторе Android. На следующем снимке экрана показана версия AppCompat Панели инструментовFun в Nexus 4 под управлением KitKat (API 19):
При использовании библиотеки AppCompat темы не нужно переключаться на основе версии Android— библиотека AppCompat позволяет обеспечить согласованный пользовательский интерфейс во всех поддерживаемых версиях Android.