ActionBar für Xamarin.Android

Bei Verwendung TabActivityhat der Code zum Erstellen der Registerkartensymbole keine Auswirkung, wenn er mit dem Android 4.0-Framework ausgeführt wird. Obwohl es funktionell funktioniert wie in Versionen von Android vor 2.3, wurde die TabActivity Klasse selbst in 4.0 veraltet. Es wurde eine neue Möglichkeit zum Erstellen einer Registerkartenschnittstelle eingeführt, die die Aktionsleiste verwendet, die als nächstes erläutert wird.

Registerkarten der Aktionsleiste

Die Aktionsleiste enthält Unterstützung für das Hinzufügen von Registerkartenschnittstellen in Android 4.0. Der folgende Screenshot zeigt ein Beispiel für eine solche Schnittstelle.

Screenshot der App, die in einem Emulator ausgeführt wird; Es werden zwei Registerkarten angezeigt.

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

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

Sobald dies erfolgt ist, können wir eine Registerkarte erstellen, indem wir die NewTab Methode auf der Aktionsleiste aufrufen. Mit dieser Registerkarteninstanz können wir die SetText Und SetIcon Methoden aufrufen, um den Beschriftungstext und das Symbol der Registerkarte festzulegen. Diese Aufrufe werden in der folgenden Reihenfolge im folgenden Code ausgeführt:

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

Bevor wir die Registerkarte jedoch hinzufügen können, müssen wir das TabSelected Ereignis behandeln. In diesem Handler können wir den Inhalt für die Registerkarte erstellen. Aktionsleistenregister sind so konzipiert, dass sie mit Fragmenten arbeiten, 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 aufblasen:

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 ereignisargument, das TabSelected im Ereignis übergeben wird, ist vom Typ TabEventArgs, der 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 der Aktionsleiste die Registerkarte hinzufügen, indem wir die AddTab Methode aufrufen, wie in diesem Code gezeigt:

this.ActionBar.AddTab (tab);

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

ShareActionProvider

Die ShareActionProvider Klasse ermöglicht eine Freigabeaktion, die über eine Aktionsleiste ausgeführt werden kann. Es kümmert sich um das Erstellen einer Aktionsansicht mit einer Liste von Apps, die eine Freigabeabsicht behandeln können, und behält einen Verlauf der zuvor verwendeten Anwendungen für den einfachen Zugriff auf sie später über die Aktionsleiste. 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 z. B. einen Screenshot einer Aktionsleiste mit einem Menüelement, um ein Bild zu teilen. Wenn der Benutzer auf das Menüelement auf der Aktionsleiste tippt, lädt der ShareActionProvider die Anwendung, um eine Absicht zu behandeln, die der ShareActionProviderAktionsleiste zugeordnet ist. In diesem Beispiel wurde die Messaginganwendung bereits verwendet, sodass sie auf der Aktionsleiste angezeigt wird.

Screenshot des Symbols

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

Screenshot der Messaging-App mit Affenbild

Angeben der Aktionsanbieterklasse

Um das ShareActionProviderandroid:actionProviderClass Attribut für ein Menüelement im XML-Code für das Menü der Aktionsleiste wie folgt zu verwenden:

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

Aufblasen des Menüs

Um das Menü zu überblasen, überschreiben OnCreateOptionsMenu wir die Aktivitätsunterklasse. Sobald wir einen Verweis auf das Menü haben, können wir die ShareActionProvider Von 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

Die ShareActionProvider Absicht wird verwendet, die an die SetShareIntent Methode im obigen Code übergeben wird, um die entsprechende Aktivität zu starten. In diesem Fall erstellen wir eine Absicht, ein Bild mithilfe des folgenden Codes zu senden:

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 ist als Ressource für die Anwendung enthalten und an einen öffentlich zugänglichen Speicherort kopiert, wenn die Aktivität erstellt wird, sodass sie für andere Anwendungen, z. B. die Messaging-App, zugänglich ist. Der Beispielcode, der zu diesem Artikel gehört, enthält die vollständige Quelle dieses Beispiels, die die Verwendung veranschaulicht.