Поделиться через


Совместимость панели инструментов

Обзор

В этом разделе объясняется, как использовать 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, выполните следующие действия.

  1. Задайте минимальные и целевые версии Android для приложения.

  2. Установите пакет NuGet AppCompat.

  3. Используйте тему AppCompat вместо встроенной темы Android.

  4. Измените его 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 и нажмите кнопку Установить:

Снимок экрана: пакет appcompat версии 7, выбранный в разделе

При установке 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, необходимо использовать версию ToolbarAppCompat. Поэтому макеты должны использоваться 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.DarkActionBarAppCompat.

Меню обновления

Для поддержки более ранних версий 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 версией ToolbarAppCompat. Затем измените определение 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):

Полный снимок экрана приложения, работающего на устройстве KitKat, отображаются обе панели инструментов

При использовании библиотеки AppCompat темы не нужно переключаться на основе версии Android— библиотека AppCompat позволяет обеспечить согласованный пользовательский интерфейс во всех поддерживаемых версиях Android.