ActionBar für Xamarin.Android

Bei Verwendung TabActivityhat der Code zum Erstellen der Registerkartensymbole keine Auswirkungen auf die Ausführung mit dem Android 4.0-Framework. Obwohl es funktionell wie in Android-Versionen vor 2.3 funktioniert, ist die TabActivity Klasse selbst in Version 4.0 veraltet. Es wurde eine neue Möglichkeit zum Erstellen einer Registerkartenbenutzeroberfläche eingeführt, die die Aktionsleiste verwendet, die als Nächstes erläutert wird.

Aktionsleistenregisterkarten

Die Aktionsleiste unterstützt das Hinzufügen von Schnittstellen mit Registerkarten in Android 4.0. Der folgende Screenshot zeigt ein Beispiel für eine solche Schnittstelle.

Screenshot: App, die in einem Emulator ausgeführt wird; Zwei Registerkarten werden angezeigt

Um Registerkarten in der Aktionsleiste zu erstellen, müssen sie zunächst die -Eigenschaft so festlegen NavigationMode , dass Registerkarten unterstützt werden. In Android 4 ist eine ActionBar Eigenschaft für die Activity-Klasse verfügbar, die wir verwenden können, um folgendes NavigationMode festzulegen:

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

Anschließend können Sie eine Registerkarte erstellen, indem Sie die NewTab -Methode auf der Aktionsleiste aufrufen. Mit dieser Registerkarte instance können wir die SetText Methoden und SetIcon aufrufen, um den Beschriftungstext und das Symbol der Registerkarte festzulegen. Diese Aufrufe werden in der reihenfolge im folgenden Code ausgeführt:

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

Bevor wir jedoch die Registerkarte hinzufügen können, müssen wir das TabSelected Ereignis behandeln. In diesem Handler können wir den Inhalt für die Registerkarte erstellen. Aktionsleistenregisterkarten sind für die Verwendung mit Fragmenten konzipiert, bei denen es sich um Klassen handelt, die einen Teil der Benutzeroberfläche in einer Aktivität darstellen. In diesem Beispiel enthält die Fragmentansicht eine einzelne TextView, die wir in unserer Fragment Unterklasse wie folgt aufblähen:

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

Das im TabSelected Ereignis übergebene Ereignisargument ist vom Typ TabEventArgs, das eine FragmentTransaction Eigenschaft enthält, die wir verwenden können, um das Fragment wie unten dargestellt hinzuzufügen:

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

Schließlich können wir die Registerkarte der Aktionsleiste hinzufügen, indem wir die AddTab -Methode aufrufen, wie in diesem Code gezeigt:

this.ActionBar.AddTab (tab);

Das vollständige Beispiel finden Sie im HelloTabsICS-Projekt im Beispielcode für dieses Dokument.

ShareActionProvider

Die ShareActionProvider -Klasse ermöglicht eine Freigabeaktion über eine Aktionsleiste. Es erstellt eine Aktionsansicht mit einer Liste von Apps, die eine Freigabeabsicht verarbeiten können, und speichert einen Verlauf der zuvor verwendeten Anwendungen, um später über die Aktionsleiste darauf zuzugreifen. Auf diese Weise können Anwendungen Daten über eine Benutzeroberfläche freigeben, die in Android konsistent ist.

Beispiel für die Bildfreigabe

Unten sehen Sie beispielsweise einen Screenshot einer Aktionsleiste mit einem Menüelement zum Freigeben eines Bilds (aus dem ShareActionProvider-Beispiel ). Wenn der Benutzer auf der Aktionsleiste auf das Menüelement tippt, lädt der ShareActionProvider die Anwendung, um eine Absicht zu behandeln, die dem ShareActionProviderzugeordnet ist. In diesem Beispiel wurde die Messaginganwendung zuvor verwendet, sodass sie auf der Aktionsleiste angezeigt wird.

Screenshot: Symbol der Messaginganwendung in der Aktionsleiste

Wenn der Benutzer auf das Element in der Aktionsleiste klickt, wird die Messaging-App gestartet, die das freigegebene Bild enthält, wie unten gezeigt:

Screenshot: Messaging-App mit Affenbild

Angeben der Aktionsanbieterklasse

Um die ShareActionProviderzu verwenden, legen Sie das android:actionProviderClass Attribut für ein Menüelement im XML-Code für das Menü der Aktionsleiste wie folgt fest:

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

Auffüllen des Menüs

Um das Menü aufzufüllen, überschreiben OnCreateOptionsMenu wir in der Unterklasse Aktivität. Sobald wir einen Verweis auf das Menü haben, können wir die ShareActionProvider aus der ActionProvider Eigenschaft des Menüelements abrufen und dann die SetShareIntent-Methode verwenden, um die ShareActionProviderAbsicht festzulegen, wie unten gezeigt:

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

Erstellen der Absicht

Verwendet ShareActionProvider die Absicht, die an die SetShareIntent Methode im obigen Code übergeben wird, um die entsprechende Aktivität zu starten. In diesem Fall erstellen wir eine Absicht zum Senden eines Images mit dem folgenden Code:

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

Das Bild im obigen Codebeispiel wird als Medienobjekt mit der Anwendung eingeschlossen und an einen öffentlich zugänglichen Speicherort kopiert, wenn die Aktivität erstellt wird, sodass es für andere Anwendungen zugänglich ist, z. B. die Messaging-App. Der diesem Artikel beigefügte Beispielcode enthält die vollständige Quelle dieses Beispiels und veranschaulicht dessen Verwendung.