ActionBar per Xamarin.Android

Quando si usa TabActivity, il codice per creare le icone delle schede non ha alcun effetto quando viene eseguito sul framework Android 4.0. Anche se funziona in modo funzionale come nelle versioni di Android precedenti alla 2.3, la TabActivity classe stessa è stata deprecata nella versione 4.0. È stato introdotto un nuovo modo per creare un'interfaccia a schede che usa la barra delle azioni, che verrà descritta di seguito.

Schede della barra delle azioni

La barra delle azioni include il supporto per l'aggiunta di interfacce a schede in Android 4.0. Lo screenshot seguente mostra un esempio di tale interfaccia.

Screenshot dell'app in esecuzione in un emulatore; vengono visualizzate due schede

Per creare schede nella barra delle azioni, è prima necessario impostarne la NavigationMode proprietà per supportare le schede. In Android 4, una ActionBar proprietà è disponibile nella classe Activity, che è possibile usare per impostare come NavigationMode segue:

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

Al termine, è possibile creare una scheda chiamando il NewTab metodo sulla barra delle azioni. Con questa istanza della scheda, è possibile chiamare i SetText metodi e SetIcon per impostare il testo e l'icona dell'etichetta della scheda. Queste chiamate vengono effettuate nell'ordine nel codice illustrato di seguito:

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

Prima di poter aggiungere la scheda, tuttavia, è necessario gestire l'evento TabSelected . In questo gestore è possibile creare il contenuto per la scheda. Le schede della barra delle azioni sono progettate per funzionare con frammenti, ovvero classi che rappresentano una parte dell'interfaccia utente in un'attività. Per questo esempio, la visualizzazione Fragment contiene un singolo TextViewoggetto , che viene gonfiato nella Fragment sottoclasse come segue:

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'argomento evento passato nell'evento TabSelected è di tipo TabEventArgs, che include una FragmentTransaction proprietà che è possibile usare per aggiungere il frammento come illustrato di seguito:

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

Infine, è possibile aggiungere la scheda alla barra delle azioni chiamando il AddTab metodo come illustrato nel codice seguente:

this.ActionBar.AddTab (tab);

Per l'esempio completo, vedere il progetto HelloTabsICS nel codice di esempio per questo documento.

ShareActionProvider

La ShareActionProvider classe consente l'esecuzione di un'azione di condivisione da una barra delle azioni. Si occupa della creazione di una visualizzazione azioni con un elenco di app in grado di gestire una finalità di condivisione e mantiene una cronologia delle applicazioni usate in precedenza per facilitarne l'accesso in un secondo momento dalla barra delle azioni. Ciò consente alle applicazioni di condividere i dati tramite un'esperienza utente coerente in Android.

Esempio di condivisione di immagini

Ad esempio, di seguito è riportato uno screenshot di una barra delle azioni con una voce di menu per condividere un'immagine. Quando l'utente tocca la voce di menu sulla barra delle azioni, ShareActionProvider carica l'applicazione per gestire una finalità associata a ShareActionProvider. In questo esempio l'applicazione di messaggistica è stata usata in precedenza, quindi viene presentata sulla barra delle azioni.

Screenshot dell'icona dell'applicazione di messaggistica nella barra delle azioni

Quando l'utente fa clic sull'elemento nella barra delle azioni, viene avviata l'app di messaggistica che contiene l'immagine condivisa, come illustrato di seguito:

Screenshot dell'app di messaggistica che mostra l'immagine di scimmia

Specifica della classe del provider di azioni

Per utilizzare ShareActionProvider, impostare l'attributo android:actionProviderClass su una voce di menu nel codice XML per il menu della barra delle azioni come indicato di seguito:

<?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>

Aumento del menu

Per gonfiare il menu, eseguiamo l'override nella sottoclasse OnCreateOptionsMenu Activity. Dopo aver ottenuto un riferimento al menu, è possibile ottenere ShareActionProvider dalla ActionProvider proprietà della voce di menu e quindi usare il metodo SetShareIntent per impostare la ShareActionProviderfinalità dell'oggetto , come illustrato di seguito:

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 ());
}

Creazione della finalità

ShareActionProvider Userà la finalità, passata al SetShareIntent metodo nel codice precedente, per avviare l'attività appropriata. In questo caso viene creata una finalità per inviare un'immagine usando il codice seguente:

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'immagine nell'esempio di codice precedente è inclusa come asset con l'applicazione e copiata in una posizione accessibile pubblicamente quando viene creata l'attività, in modo che sia accessibile ad altre applicazioni, ad esempio l'app di messaggistica. Il codice di esempio che accompagna questo articolo contiene l'origine completa di questo esempio, illustrandone l'uso.