Partager via


ActionBar pour Xamarin.Android

Lorsque vous utilisez TabActivity, le code permettant de créer les icônes d’onglet n’a aucun effet lors de l’exécution sur l’infrastructure Android 4.0. Bien que fonctionnellement, il fonctionne comme dans les versions d’Android antérieures à 2.3, la TabActivity classe elle-même a été déconseillée dans la version 4.0. Une nouvelle façon de créer une interface à onglets a été introduite qui utilise la barre d’actions, que nous aborderons ensuite.

Onglets de barre d’actions

La barre d’actions prend en charge l’ajout d’interfaces par onglets dans Android 4.0. La capture d’écran suivante montre un exemple de cette interface.

Capture d’écran de l’application en cours d’exécution dans un émulateur ; deux onglets sont affichés

Pour créer des onglets dans la barre d’actions, nous devons d’abord définir sa NavigationMode propriété pour prendre en charge les onglets. Dans Android 4, une ActionBar propriété est disponible sur la classe Activity, que nous pouvons utiliser pour définir ce NavigationMode qui suit :

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

Une fois cette opération effectuée, nous pouvons créer un onglet en appelant la NewTab méthode dans la barre d’actions. Avec cette instance d’onglet, nous pouvons appeler les méthodes et SetIcon les SetText méthodes pour définir le texte et l’icône de l’étiquette de l’onglet ; ces appels sont effectués dans l’ordre dans le code indiqué ci-dessous :

var tab = this.ActionBar.NewTab ();
tab.SetText (tabText);
tab.SetIcon (Resource.Drawable.ic_tab_white);

Avant de pouvoir ajouter l’onglet toutefois, nous devons gérer l’événement TabSelected . Dans ce gestionnaire, nous pouvons créer le contenu de l’onglet. Les onglets de barre d’actions sont conçus pour fonctionner avec des fragments, qui sont des classes qui représentent une partie de l’interface utilisateur dans une activité. Pour cet exemple, la vue du fragment contient un seul TextView, que nous gonflons dans notre Fragment sous-classe comme suit :

class SampleTabFragment: Fragment
{           
    public override View OnCreateView (LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView (inflater, container, savedInstanceState);

        var view = inflater.Inflate (
            Resource.Layout.Tab, container, false);

        var sampleTextView =
            view.FindViewById<TextView> (Resource.Id.sampleTextView);            
        sampleTextView.Text = "sample fragment text";

        return view;
    }
}

L’argument d’événement passé dans l’événement TabSelected est de type TabEventArgs, qui inclut une FragmentTransaction propriété que nous pouvons utiliser pour ajouter le fragment, comme indiqué ci-dessous :

tab.TabSelected += delegate(object sender, ActionBar.TabEventArgs e) {             
    e.FragmentTransaction.Add (Resource.Id.fragmentContainer,
        new SampleTabFragment ());
};

Enfin, nous pouvons ajouter l’onglet à la barre d’actions en appelant la AddTab méthode comme indiqué dans ce code :

this.ActionBar.AddTab (tab);

Pour obtenir l’exemple complet, consultez le projet HelloTabsICS dans l’exemple de code de ce document.

ShareActionProvider

La ShareActionProvider classe permet à une action de partage d’être effectuée à partir d’une barre d’actions. Il s’occupe de créer un affichage d’action avec une liste d’applications qui peuvent gérer une intention de partage et conserve un historique des applications précédemment utilisées pour faciliter l’accès à ces applications ultérieurement à partir de la barre d’actions. Cela permet aux applications de partager des données via une expérience utilisateur cohérente dans Android.

Exemple de partage d’images

Par exemple, vous trouverez ci-dessous une capture d’écran d’une barre d’actions avec un élément de menu pour partager une image. Lorsque l’utilisateur appuie sur l’élément de menu dans la barre d’actions, ShareActionProvider charge l’application pour gérer une intention associée au ShareActionProvider. Dans cet exemple, l’application de messagerie a été utilisée précédemment. Elle est donc présentée dans la barre d’actions.

Capture d’écran de l’icône d’application de messagerie dans la barre d’actions

Lorsque l’utilisateur clique sur l’élément dans la barre d’actions, l’application de messagerie qui contient l’image partagée est lancée, comme indiqué ci-dessous :

Capture d’écran de l’application de messagerie affichant l’image singe

Spécification de la classe de fournisseur d’actions

Pour utiliser ShareActionProvider, définissez l’attribut android:actionProviderClass sur un élément de menu dans le code XML du menu de la barre d’actions comme suit :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/shareMenuItem"
      android:showAsAction="always"
      android:title="@string/sharePicture"
      android:actionProviderClass="android.widget.ShareActionProvider" />
</menu>

Inflating the Menu

Pour gonfler le menu, nous substituons OnCreateOptionsMenu dans la sous-classe Activité. Une fois que nous avons une référence au menu, nous pouvons obtenir à ShareActionProvider partir de la ActionProvider propriété de l’élément de menu, puis utiliser la méthode SetShareIntent pour définir l’intention de l’utilisateur ShareActionProvider, comme indiqué ci-dessous :

public override bool OnCreateOptionsMenu (IMenu menu)
{
    MenuInflater.Inflate (Resource.Menu.ActionBarMenu, menu);       

    var shareMenuItem = menu.FindItem (Resource.Id.shareMenuItem);           
    var shareActionProvider =
       (ShareActionProvider)shareMenuItem.ActionProvider;
    shareActionProvider.SetShareIntent (CreateIntent ());
}

Création de l’intention

L’intention ShareActionProvider est utilisée, transmise à la SetShareIntent méthode dans le code ci-dessus, pour lancer l’activité appropriée. Dans ce cas, nous créons une intention d’envoyer une image à l’aide du code suivant :

Intent CreateIntent ()
{  
    var sendPictureIntent = new Intent (Intent.ActionSend);
    sendPictureIntent.SetType ("image/*");
    var uri = Android.Net.Uri.FromFile (GetFileStreamPath ("monkey.png"));          
    sendPictureIntent.PutExtra (Intent.ExtraStream, uri);
    return sendPictureIntent;
}

L’image de l’exemple de code ci-dessus est incluse en tant que ressource avec l’application et copiée dans un emplacement accessible publiquement lors de la création de l’activité, de sorte qu’elle sera accessible à d’autres applications, telles que l’application de messagerie. L’exemple de code qui accompagne cet article contient la source complète de cet exemple, illustrant son utilisation.