Share via


ActionBar para Xamarin.Android

Cuando se usa TabActivity, el código para crear los iconos de pestaña no tiene ningún efecto cuando se ejecuta en el marco de Android 4.0. Aunque funciona funcionalmente como hizo en versiones de Android anteriores a la 2.3, la propia clase TabActivity ha quedado en desuso en la versión 4.0. Se ha introducido una nueva manera de crear una interfaz con pestañas que usa la Barra de acciones, que analizaremos a continuación.

Pestañas de Barra de acciones

La Barra de acciones incluye compatibilidad para agregar interfaces con pestañas en Android 4.0. En la captura de pantalla siguiente se muestra un ejemplo de dicha interfaz.

Captura de pantalla de la aplicación que se ejecuta en un emulador; se muestran dos pestañas

Para crear pestañas en la Barra de acciones, primero es necesario establecer su propiedad NavigationMode para admitir pestañas. En Android 4, una propiedad ActionBar está disponible en la clase Activity, que podemos usar para establecer NavigationMode así:

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

Una vez hecho esto, podemos crear una pestaña llamando al método NewTab en la Barra de acciones. Con esta instancia de pestaña, podemos llamar a los métodos SetText y SetIcon para establecer el texto y el icono de la etiqueta de la pestaña; estas llamadas se realizan en orden en el código que se muestra a continuación:

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

Sin embargo, para poder agregar la pestaña, es necesario controlar el evento TabSelected. En este controlador, podemos crear el contenido de la pestaña. Las pestañas de la Barra de acciones están diseñadas para trabajar con fragmentos, que son clases que representan una parte de la interfaz de usuario de una clase Activity. En este ejemplo, la vista del fragmento contiene un único TextView, que inflamos en nuestra subclase Fragment así:

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

El argumento de evento pasado en el evento TabSelected es de tipo TabEventArgs, que incluye una propiedad FragmentTransaction que podemos usar para agregar el fragmento como se muestra a continuación:

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

Por último, podemos agregar la pestaña a la Barra de acciones llamando al método AddTab como se muestra en este código:

this.ActionBar.AddTab (tab);

Para obtener el ejemplo completo, vea el proyecto HelloTabsICS en el código de ejemplo de este documento.

ShareActionProvider

La clase ShareActionProvider permite realizar una acción de uso compartido desde una Barra de acciones. Se encarga de crear una vista de acción con una lista de aplicaciones que pueden controlar una intención de uso compartido y mantiene un historial de las aplicaciones usadas anteriormente para facilitar el acceso a ellas más adelante desde la Barra de acciones. Esto permite a las aplicaciones compartir datos a través de una experiencia de usuario coherente en Android.

Ejemplo de uso compartido de imágenes

Por ejemplo, a continuación se muestra una captura de pantalla de una Barra de acciones con un elemento de menú para compartir una imagen. Cuando el usuario pulsa el elemento de menú en la Barra de acciones, ShareActionProvider carga la aplicación para controlar una intención asociada a ShareActionProvider. En este ejemplo, la aplicación de mensajería se ha usado anteriormente, por lo que se presenta en la Barra de acciones.

Captura de pantalla del icono de la aplicación de mensajería en la Barra de acciones

Cuando el usuario hace clic en el elemento de la Barra de acciones, se inicia la aplicación de mensajería que contiene la imagen compartida, como se muestra a continuación:

Captura de pantalla de la aplicación de mensajería que muestra la imagen de un mono

Especificación de la clase de proveedor de acciones

Para usar ShareActionProvider, establezca el atributo android:actionProviderClass en un elemento de menú en el XML para el menú de la Barra de acciones de la siguiente manera:

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

Inflar el menú

Para inflar el menú, invalidamos OnCreateOptionsMenu en la subclase Activity. Una vez que tengamos una referencia al menú, podemos obtener ShareActionProvider de la propiedad ActionProvider del elemento de menú y, a continuación, usar el método SetShareIntent para establecer la intención de ShareActionProvider, como se muestra a continuación:

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

Creación de la intención

ShareActionProvider usará la intención, que se pasa al método SetShareIntent en el código anterior, para iniciar la clase Activity adecuada. En este caso, creamos una intención para enviar una imagen mediante el código siguiente:

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

La imagen del ejemplo de código anterior se incluye como un recurso con la aplicación y se copia en una ubicación accesible públicamente cuando se crea la clase Activity, por lo que será accesible para otras aplicaciones, como la aplicación de mensajería. El código de ejemplo que acompaña a este artículo contiene el origen completo de este ejemplo, que ilustra su uso.