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.
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.
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:
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.