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:
Defina as versões Mínima e de Destino do Android para o aplicativo.
Instale o pacote NuGet do AppCompat.
Use um tema AppCompat em vez de um tema Android integrado.
Modifique
MainActivity
para que ele subclassesAppCompatActivity
em vez deActivity
.
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:
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
SetSupportActionBar
por . 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):
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.