Compartilhar via


Compatibilidade da barra de ferramentas

Visão geral

Esta seção explica como usar Toolbar em versões do Android anteriores ao Android 5.0 Lollipop. Se o seu aplicativo não oferecer suporte a versões do Android anteriores ao Android 5.0, você poderá ignorar esta seção.

Como Toolbar faz parte da biblioteca de suporte do Android v7, ele pode ser usado em dispositivos que executam o Android 2.1 (API nível 7) e superior. No entanto, a Biblioteca de Suporte do Android v7 AppCompat NuGet deve ser instalada e o código modificado para que ele use a Toolbar implementação fornecida nesta biblioteca. Esta seção explica como instalar este NuGet e modificar o aplicativo ToolbarFun de Adicionando uma segunda barra de ferramentas para que ele seja executado em versões do Android anteriores ao Lollipop 5.0.

Para modificar um aplicativo para usar a versão AppCompat da barra de ferramentas:

  1. Defina as versões Mínima e de Destino do Android para o aplicativo.

  2. Instale o pacote NuGet do AppCompat.

  3. Use um tema AppCompat em vez de um tema Android integrado.

  4. Modifique MainActivity para que ele subclasses AppCompatActivity em vez de Activity.

Cada uma dessas etapas é explicada em detalhes nas seções a seguir.

Definir a versão mínima e de destino do Android

A Estrutura de Destino do aplicativo deve ser definida como Nível de API 21 ou superior ou o aplicativo não será implantado corretamente. Se um erro como Nenhum identificador de recurso encontrado para o atributo 'tileModeX' no pacote 'android' for visto durante a implantação do aplicativo, isso ocorre porque o Target Framework não está definido para Android 5.0 (API Level 21 - Lollipop) ou superior.

Defina o nível da Estrutura de Destino para o Nível de API 21 ou superior e defina as configurações do projeto de nível de API do Android para a versão mínima do Android que o aplicativo deve suportar. Para obter mais informações sobre como definir níveis de API do Android, consulte Noções básicas sobre níveis de API do Android. No exemplo, a ToolbarFun versão mínima do Android é definida como KitKat (API Nível 4.4).

Instalar o pacote NuGet do AppCompat

Em seguida, adicione o pacote AppCompat da Biblioteca de Suporte do Android v7 ao projeto. No Visual Studio, clique com o botão direito do mouse em Referências e selecione Gerenciar Pacotes NuGet.... Clique em Procurar e procure Android Support Library v7 AppCompat. Selecione Xamarin.Android.Support.v7.AppCompat e clique em Instalar:

Captura de tela do pacote V7 Appcompat selecionado em Gerenciar pacotes NuGet

Quando esse NuGet é instalado, vários outros pacotes NuGet também são instalados, se ainda não estiverem presentes (como Xamarin.Android.Support.Animated.Vector.Drawable, Xamarin.Android.Support.v4 e Xamarin.Android.Support.Vector.Drawable). Para obter mais informações sobre como instalar pacotes NuGet, consulte Demonstra Passo a passo: incluindo um NuGet em seu projeto.

Usar um tema e uma barra de ferramentas do AppCompat

A biblioteca AppCompat vem com vários Theme.AppCompat temas que podem ser usados em qualquer versão do Android suportada pela biblioteca AppCompat. O ToolbarFun tema do aplicativo de exemplo é derivado de Theme.Material.Light.DarkActionBar, que não está disponível em versões do Android anteriores ao Lollipop. Portanto, ToolbarFun deve ser adaptado para usar a contraparte AppCompat para este tema, Theme.AppCompat.Light.DarkActionBar. Além disso, como Toolbar não está disponível em versões do Android anteriores ao Lollipop, devemos usar a versão AppCompat do Toolbar. Portanto, os layouts devem usar android.support.v7.widget.Toolbar em vez de Toolbar.

Atualizar layouts

Edite Resources/layout/Main.axml e substitua o Toolbar elemento com o seguinte 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" />

Edite Recursos/layout/toolbar.xml e substitua seu conteúdo pelo seguinte 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"/>

Observe que os ?attr valores não são mais prefixados com android: (lembre-se de que a notação faz referência a ? um recurso no tema atual). Se ?android:attr ainda fosse usado aqui, o Android faria referência ao valor do atributo da plataforma em execução no momento, em vez da biblioteca AppCompat. Como este exemplo usa o actionBarSize definido pela biblioteca AppCompat, o prefixo android: é descartado. Da mesma forma, @android:style é alterado para @style que o android:theme atributo seja definido como um tema na biblioteca AppCompat – o ThemeOverlay.AppCompat.Dark.ActionBar tema é usado aqui em vez de ThemeOverlay.Material.Dark.ActionBar.

Atualizar o estilo

Edite Recursos/valores/styles.xml e substitua seu conteúdo pelo seguinte 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>

Os nomes de item e o tema pai neste exemplo não são mais prefixados android: porque estamos usando a biblioteca AppCompat. Além disso, o tema pai é alterado para a versão AppCompat do Light.DarkActionBar.

Menus de atualização

Para oferecer suporte a versões anteriores do Android, a biblioteca AppCompat usa atributos personalizados que espelham os android: atributos do namespace. No entanto, alguns atributos (como o showAsAction atributo usado na <menu> tag) não existem na estrutura do Android em dispositivos mais antigos – showAsAction foi introduzido na API 11 do Android, mas não está disponível na API 7 do Android. Por esse motivo, um namespace personalizado deve ser usado para prefixar todos os atributos definidos pela biblioteca de suporte. Nos arquivos de recurso de menu, um namespace chamado local é definido para prefixar o showAsAction atributo.

Edite Recursos/menu/top_menus.xml e substitua seu conteúdo pelo seguinte 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>

O local namespace é adicionado com esta linha:

xmlns:local="http://schemas.android.com/apk/res-auto">

O showAsAction atributo é precedido com esse local: namespace em vez de android:

local:showAsAction="ifRoom"

Da mesma forma, edite Recursos/menu/edit_menus.xml e substitua seu conteúdo pelo seguinte 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>

Como essa opção de namespace fornece suporte para o atributo em versões do showAsAction Android anteriores ao Nível 11 da API? O atributo showAsAction personalizado e todos os seus valores possíveis são incluídos no aplicativo quando o AppCompat NuGet é instalado.

Subclasse AppCompatActivity

A etapa final na conversão é modificar MainActivity para que seja uma subclasse de AppCompatActivity. Edite MainActivity.cs e adicione as seguintes using instruções:

using Android.Support.V7.App;
using Toolbar = Android.Support.V7.Widget.Toolbar;

Isso declara Toolbar ser a versão AppCompat do Toolbar. Em seguida, altere a definição de classe de MainActivity:

public class MainActivity : AppCompatActivity

Para definir a barra de ações para a versão AppCompat do Toolbar, substitua a chamada para SetActionBar SetSupportActionBarpor . Neste exemplo, o título também é alterado para indicar que a versão AppCompat do Toolbar está sendo usada:

SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";

Finalmente, altere o nível mínimo do Android para o valor pré-Lollipop que deve ser suportado (por exemplo, API 19).

Crie o aplicativo e execute-o em um dispositivo pré-Lollipop ou emulador Android. A captura de tela a seguir mostra a versão AppCompat do ToolbarFun em um Nexus 4 executando KitKat (API 19):

Captura de tela inteira do aplicativo em execução em um dispositivo KitKat, ambas as barras de ferramentas são mostradas

Quando a biblioteca AppCompat é usada, os temas não precisam ser alternados com base na versão do Android – a biblioteca AppCompat torna possível fornecer uma experiência de usuário consistente em todas as versões suportadas do Android.