sábado, 27 de abril de 2013


Como utilizar elementos de Android ICS en Froyo: SherlockActionBar


Hay mucha gente contribuyendo para hacernos la vida más fácil, y ese es el caso de la Sherlock Action Bar, http://actionbarsherlock.com/. Es una librería que nos ayudará en el proceso de crear aplicaciones más fácilmente y con un aspecto muy bonito. Os recomiendo que os descargueis las aplicaciones con todos los ejemplos para que podáis ver más facilmente lo que se puede hacer.

El método para empezar a trabajar con ella es muy fácil, simplemente os descargáis la última versión. Yo la he descargado y guardado en una carpeta a parte de donde tengo todos los desarrollos. Ahora importamos el proyecto, para ello vamos a File > New Project > Android Project. Seleccionamos crear desde un proyecto existente y buscamos donde tenemos descargada la SherlockActionBar la carpeta library. Seleccionamos la versión 4.0 de Android y creamos el proyecto.

Ahora podemos incluir en cualquier proyecto esta librería y empezar a trabajar en ella. Para ello hacemos botón derecho sobre nuestro proyecto, vamos a Properties > Android. Abajo de todo, en la sección de librerías, añadimos una librería nueva y aparecerá la Sherlock Action Bar entre las disponibles. La añadís y aplicamos los cambios.

En el AndroidManifest.xml es muy importante añadir uno de los themes de la SherlockActionBar, debería quedar algo así:


<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" android:theme="@style/Theme.Sherlock.Light">


El último cambio, como antes, es modificar el AndroidManifest.xml, indicando la versión mínima y la versión "target" o destino. Si todo va bien deberíais ejecutar simplemente la aplicación en una máquina con una versión 2.x y que funcione.

En el vídeo explicativo de la web de SherlockActionBar nos dice que tenemos que añadir la librería del Android Support en nuestro proyecto, pero no debéis hacerlo ya que la coge de la SherlockActionBar y os daría problemas.

Cómo utilizar la ActionBar de Sherlock en Android

La expansión de ActionBarSherlock está muy bien ya que nos va a permitir utilizar todo aquello que se fue implementando en HoneyComb y Ice Cream Sandwich en nuestras aplicaciones con Android 2.x.


Los que os decidáis a utilizar la librería de Sherlock, no vais a tener problemas en utilizar la librería que proporciona Google, ya que esta Sherlock contiene a la de Google.

La librería de Sherlock permite hacer bastantes cosas, los que os descargasteis e instalasteis las aplicaciones de ejemplo seguramente ya visteis algo. Tenéis a vuestra disposición Fragments, Loaders y sobre todo la Action Bar, hoy vamos a ver un ejemplo de como funciona. Yo he cogido varios ejemplos, los he simplificado, y alguna cosilla más que he buscado por internet que no encontré en la documentación y me he creado un menú. Vamos a ver como hacerlo.

Vamos a abrir un proyecto y siguiendo los pasos de la semana pasada vamos a añadir la librería ActionBarSherlock. Una vez hecho esto abriremos la activity donde queremos crear el menú y cambiamos el extends Activity por SherlockActivity o SherlockFragmentActivity, para nuestro ejemplo da igual cual escojáis.

Para que no tengáis que repetir el código del menú a través de todas vuestras activities, podéis crearos una clase que herede de activity donde tengáis el código común a todas, como puede ser este menú, y vuestras activities "de verdad", en vez de heredar de Activity, SherlockActivity o SherlockFragmenActivity que herede de esta clase. De esta forma, un cambio en el menú es muy fácil y rápido.

Bueno, vamos a ver como añadir el menú a nuestra aplicación:


public class ActivityManager extends SherlockFragmentActivity {
 
@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().setDisplayShowCustomEnabled(true);
        shareTitle = "Titulo de lo que compartimos por defecto";
        shareUrl = "Url de lo que compartimos por defecto";
} 
  
protected void setTitle(String title){
  getSupportActionBar().setTitle(title);
}
  
protected void setSubTitle(String subtitle){
  getSupportActionBar().setSubtitle(subtitle);
}
  
private String shareTitle;
private String shareUrl;
protected void setShare(String shareTitle, String shareUrl) {
  this.shareTitle = shareTitle;
  this.shareUrl = shareUrl;
  actionProvider.setShareIntent(shareIntent(this.shareUrl, this.shareTitle));
}
 
ShareActionProvider actionProvider;
  
protected SubMenu subMenu;
 
@Override
public boolean onCreateOptionsMenu(Menu menu) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  
        getSupportMenuInflater().inflate(R.menu.share_action_provider, menu);

        MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
        actionProvider = (ShareActionProvider) actionItem.getActionProvider();
        actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
        
        actionProvider.setShareIntent(shareIntent(shareUrl, shareTitle));
  
        subMenu = menu.addSubMenu("Opciones");
         subMenu.add("Home")
         .setOnMenuItemClickListener(new OnMenuItemClickListener() {    
    public boolean onMenuItemClick(MenuItem item) {
     //Implementar aquí la navegación necesaria
     return false;
    }
   });
          subMenu.add("Otro")
      .setOnMenuItemClickListener(new OnMenuItemClickListener() {   
    public boolean onMenuItemClick(MenuItem item) {
     //Implementar aquí la navegación necesaria
     return false;
    }
   });

        subMenu.getItem().setIcon(R.drawable.abs__ic_menu_moreoverflow_holo_light);
        subMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);


        return super.onCreateOptionsMenu(menu);
}
  
public void addSubMenu(String title, OnMenuItemClickListener l){
   subMenu.add(title)
     .setOnMenuItemClickListener(l);
}
      
@Override
public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
        case android.R.id.home:            
            //Implementar aquí la navegación necesaria
            return true;               
        default:
            return super.onOptionsItemSelected(item);
        }  
    }

private Intent shareIntent(String linkShare, String titleShare){
 final Intent intent = new Intent(Intent.ACTION_SEND);
 intent.setType("text/plain");
 intent.putExtra(Intent.EXTRA_SUBJECT, titleShare);
 intent.putExtra(Intent.EXTRA_TEXT, linkShare);
 return intent;
}
}


Antes de explicar nada, si escribís este código, vais a notar que despues de añadir todos los import necesarios os dará un error en la línea donde aparece el menú R.menu.share_action_provider, esto es porque hay que crear una especie de layout para este menú. La forma de hacerlo es muy sencilla, simplemente en la carpeta res creais una subcarpeta llamada menu, y a continuación un archivo nuevo llamado share_action_provider.xml. En este archivo colocáis el siguiente código:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_item_share_action_provider_action_bar"
        android:showAsAction="always"
        android:title="@string/action_bar_share_with"
        android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider" />
</menu>


Como os decía, un menú es una especie de layout donde se ponen las opciones de un menú. En este caso estamos añadiendo un widget que ya está listo y preparado en la librería ActionBarSherlock y que nos va a permitir compartir en las diferentes redes sociales. El ejemplo de la ActionBarSherlock es un poco más elaborado y comparten una imagen, podéis echarle un ojo en los ejemplos que pone a disposición de todos.

Vamos ahora a ver el código que nos quedó pendiente por explicar. Empezamos por el onCreate, en el definimos el titulo y la url de lo que compartiremos en esta activity por defecto. También accedemos por primera vez a la action bar con getSupportActionBar. En este caso únicamente le decimos que muestre la barra. Echadle un ojo a todos los métodos de getSupportActionBar, tiene muchos métodos interesantes que por espacio no vamos a comentar aquí.

Con los métodos setTitle y setSubTitle podremos setear el título de la action bar en cualquier Activity que herede de esta, y con setShare vamos a cambiar el título y el enlace de lo que queremos compartir. Para compartir se utiliza el método shareIntent, está al final de todo, le pasamos el titulo y el enlace para crear un Intent que se le pasa al widget que se encarga del resto.

El siguiente método, onCreateOptionsMenu, es un evento asociado a una activity que se encarga de construir las opciones del menú. Aquí el menú como lo conocemos en las versiones 2.x de Android desaparece y se pasan a la Action Bar. Lo primero de todo, le decimos que el icono de la aplicación sea un botón para volver hacia la pantalla principal o hacia atrás, esto luego veremos como se hace.

Después hacemos un inflate, es decir, añadimos la plantilla del menú que creamos antes a nuestro menú. Luego se inicializa nuestro objeto ShareActionProvider, y seteamos dos cosas, por un lado, la última red social donde se compartió con setShareHistoryFileName y lo que vamos a compartir con setShareIntent.

Hasta aquí ya podríamos tener un menú, ahora añadiremos alguna opción más. Nosotros lo haremos a través de un submenú. Para ello definimos subMenu y la hacemos protected para poder utilizar en las clases que hereden de esta. Añadimos opciones con subMenu.add("titulo") y seteamos la acción que hará en el onClick, puede ser una navegación a otro sitio o una acción, aquí vais a poner lo que vosotros necesitéis. Al final de todo seteais el icono de este submenú, y como se verá, yo aquí solo quiero que se vea el icono, no el texto.

El icono que he seleccionado está incluido en la librería de ActionBarSherlock, y es el que se pone ahora en ICS en aplicaciones como GMail entre otras. Antes de poneros a buscar iconos por internet echadle un ojo a los que hay aquí.

Como no podía ser de otra forma, en cualquier aplicación siempre vais a tener excepciones y seguro que hay alguna activity que necesita alguna opción más que no son las de siempre, para ello tenéis el métodoaddSubmenu. Con este podéis incluir cualquier otra opción con su correspondiente acción sin tener que hacer nada raro en esta clase.

El último método que os voy a explicar es el onOptionsItemSelected, desde aquí podeis controlar cuando se hace click sobre una determinada opción del menú, esto no sería necesario ya que como visteis antes al crear cada una de las opciones también seteabamos el onClick. Aún así existe una excepción, el click de la imagen de la aplicación que antes dijimos que actuaría para volver hacia la home. En la documentación no encontré como hacerlo, pero buscando en internet vi que simplemente comparando el getItemId() del item que se ha pulsado con el integer que nos da android.R.id.home deben coincidir, y es aquí cuando podemos lanzar una llamada para navegar a la home o lo que vosotros queráis.

Bueno, hasta aquí por esta semana, ahora ya es cosa vuestra el investigar que más se puede hacer con esta librería. Desde mi punto de vista es muy útil y os ahorrará bastante trabajo. Os dejo dos pantallas sacadas desde mi HTC Desire con la versión 2.2 con algunos de los ejemplos.


Como utilizar elementos de Android ICS en Froyo: Android Support


Como utilizar elementos de Android ICS en Froyo: Android Support

Con la llegada de Honeycomb vino la ActionBar y otras muchas novedades para los desarrolladores de Android. Estos elementos en un primer momento fueron exclusivos para los usuarios de tablets, pero con la llegada de Ice Cream Sandwich y su compatibilidad en teléfonos móviles, todas estas novedades se expandieron en todo tipo de dispositivo Android.


Aún así el problema que tenemos hoy en día es que la inmensa mayoría de dispositivos Android están con versiones 2.x, sin ir más lejos yo aún tengo un HTC Desire con la 2.2 y que para mí cumple a las mil maravillas todas sus funciones. Por eso muchos de nosotros a la hora de empezar un proyecto tenemos que decidir si incluir las nuevas funcionalidades que nos brinda ICS o optar por llegar a cuantos más usuarios mejor y optar por desarrollar una versión para dispositivos a partir de Android 2.x.

Ese problema se ha acabado. Google ha lanzado una librería que nos da soporte para poder utilizar las características de ICS en dispositivos con Android 2.x. La librería en cuestión se llama Android Support y para instalarla no teneis más que ir a vuestro Android SDK Manager. Podéis hacerlo desde Eclipse en Window > Android SDK Manager. Ahí debéis buscar en la sección extras, Android Support, lo seleccionais y actualizais.



Una vez actualizado, incluirlo en vuestro proyecto es muy fácil, simplemente botón derecho sobre el proyecto y en Android Tools seleccionais Add Support Library. Esto incluirá la librería .jar que hará que sea posible utilizar la actionbar, fragments, loaders y más cosas.

En este proceso si vuestro proyecto está configurado para una versión de Android 2.x debéis cambiarlo. Para ello, botón derecho sobre el proyecto, properties y en la pestaña Android seleccionáis la versión de Android 4.x.



En el archivo AndroidManifest.xml debeis configurar la línea donde indicamos la versión de Android necesaria así:

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />

Aquí le digo que la versión mínima es la 8 (Android 2.2) pero está dirigida a la 15 (Android 4).

Hasta aquí esto es lo que Google nos da oficialmente. Pero hay mucha gente contribuyendo para hacernos la vida más fácil, y ese es el caso de la Sherlock Action Bar, http://actionbarsherlock.com/. Es una librería que nos ayudará en el proceso de crear aplicaciones más fácilmente y con un aspecto muy bonito. Os recomiendo que os descargueis las aplicaciones con todos los ejemplos para que podáis ver más facilmente lo que se puede hacer.

martes, 23 de abril de 2013

Curso Android

Encontraremos un curso sencillo en la siguiente direccion:

http://www.htcmania.com/mediawiki/index.php/Programaci%C3%B3n_de_aplicaciones_para_m%C3%B3viles_Android

Depurar en Eclipse


Programación y errores de código es un binomio inseparable. Por lo tanto, resulta fundamental sacar el máximo provechos a las herramientas de depuración.

Depurar con Eclipse

El plug-in de Android para Eclipse tiene una excelente integración con el depurador de Eclipse. Introduce un error en tu código modificando el código fuente de MainActivity para que en método onCreate tenga este este código:
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       Object o = null;
       o.toString();
       setContentView(R.layout.activity_main);
   }
Este cambio introduce un NullPointerException en tu código. Si ahora ejecutas tu aplicación, te aparecerá esto:
Archivo:Componentes4.png

lunes, 22 de abril de 2013

Fixed Tabs y Scrollable Tabs (Crear una view que se mantenga para todas las pestañas)

Para explicar esto nos vamos a ayudar de un ejemplo.

En nuestro caso queremos realizar un TPV (Terminal de Punto de Venta) en android, para ello usaremos Scrollable Tabs de forma que en cada tab sea una categoría de productos y de esa forma se muestren todos los productos de dicha categoría.

Al final de todas las Tabs tendremos la información del Total de la cuenta (lo que deberíamos cobrar).

En este punto es donde nos encontramos el problema, ya que si declaramos ese view en todas las pestaña vemos que al pasar de una a otra sucede lo que vemos en la siguiente imagen

Views (Anclar Layout al pie de un view)

Para realizar esto es muy sencillo, tan solo hace falta añadir android:layout_alignParentBottom="true" al Layout que deseamos que ocupe el pie del view

Un ejemplo seria el siguiente:


<LinearLayout 
     android:id="@+id/total2"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:layout_alignParentBottom="true"
     android:orientation="horizontal"                                             android:background="@drawable/border" >

     <TextView
         ....

 </LinearLayout>

viernes, 19 de abril de 2013

Action Bar (Scrollable Tabs)

Lo primero que debemos aclarar es que los Scrollable Tabs no son un elemento del Actión Bar como son las Fixed Tabs, pero debido a su similitud las incluimos dentro de la seccion Action Bar.

Las Scrollable Tabs son muy utiles debido a que pueden contener un mayor número de Tabs que las Tabs tipicas. Para acceder a la tab anterior / siguiente basta con deslizare el dedo hacia la izquierda o derecha sobre la pantalla.

Para crear estas Tabs empezaremos ayudandonos de Ecipse, para ello debemos crear una nueva actividad.

jueves, 18 de abril de 2013

Menús (Crear Submenú)

Para la creación de un submenu es tan sencillo como en el archivo de menu (p.e. menu/tpv.xml) añadir lo siguiente:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_add3"
          android:icon="@drawable/ic_launcher"
          android:title="@string/menu_save"
          android:showAsAction="ifRoom">
        <menu>
            <item android:id="@+id/SubMnuOpc13"
                  android:title="Opcion 3.13" />
            <item android:id="@+id/SubMnuOpc23"
                  android:title="Opcion 3.23" />
        </menu>
    </item>
</menu>

miércoles, 17 de abril de 2013

Action Bar (Crear Botones de Accion)


Añadir botones de acción

Un item de acción es simplemente un item de menú del menú de opciones que debería aparecer en la barra de acción. Un item de acción puede incluir un icono y/o texto. Si un item de menú no aparece como un item de acción , el sistema lo coloca en un overflow menu, que el usuario puede abrir con el icono del menú en la parte derecha de la barra de acción.

Figura 2. Pantallazo de una barra de acción con dos items de acción y el overflow menu.
Cuando la actividad se inicia, el sistema rellena la barra de acción y el overflow menu llamando al método onCreateOptionsMenu(). Tal y como se detalla en la sección Crear menús, es en este método callback donde se define el menú de opciones para la actividad.
Se puede hacer que item del menú aparezca como un item de acción—si existe lugar para él—desde el recurso de menú mediante la declaración del android:showAsAction="ifRoom" para el elemento <item>. De esta manera, el item del menú aparece como acceso directo en la barra de acción sólo si existe lugar para ello. Si no hay suficiente lugar, el item se coloca en el overflow menu (mostrado por el icon del menú en la parte derecha de la barra de acción).
También se puede declarar un item del menú para que aparezca como un item de acción en el código de la aplicación, llamando al método setShowAsAction() en el MenuItem y pasándole SHOW_AS_ACTION_IF_ROOM.
Si el item del menú tiene un título y un icono, el item de acción, por defecto sólo muestra el icono. Si se quiere incluir el texto con el item de acción, hay que añadir el flag "with text": en el XML, añadir withText al atributo android:showAsAction o, utilizar en el código de la aplicación el flag SHOW_AS_ACTION_WITH_TEXT cuando se llama al método setShowAsAction(). La figura 2 muestra una barra de acción que tiene dos items de acción con su texto y el icono para el overflow menu.

Action Bar (Eliminar titulo de Actividad)

Para eliminar el nombre de la actividad de la Action Bar solo es necesario editar en el Manifest la propiedad android:label y darle el valor "".

Esto funciona para todas las actividades salvo para la especificada como Main.

Un ejemplo del código es el siguiente:
<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.splashlogin.Splash"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:screenOrientation="landscape"
            android:theme="@style/FullscreenTheme" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.splashlogin.Login"
            android:label="" 
            android:screenOrientation="landscape">
        </activity>
    </application>

Action Bar (Añadir, Eliminar...)


Añadir la barra de acción

La barra de acción se incluye por defecto en todas las actividades cuya version sea Android 3.0 o superior. Más especificamente, todas las actividades que utilizan el nuevo tema "holográfico" incluyen la barra de acción, y cualquier aplicación que tiene como objetivo Android 3.0 recibe automáticamente este tema. Se considera que una aplicación tiene como "objetivo" Android 3.0 cuando se ha seteado bien el atributo android:minSdkVersion o bien el atributoandroid:targetSdkVersion en el elemento <uses-sdk> del archivo Manifest a "11" o mayor que 11. Por ejemplo:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.helloworld"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4"
              android:targetSdkVersion="11" />
    <application ... >
        ...
    </application>
</manifest>
En este ejemplo, la aplicación necesita una versión mínima de nivel API 4 (Android 1.6), pero también tiene como objetivo API nivel 11 (Android 3.0). De esta manera, cuando se instala la aplicación en un dispositivo con Android 3.0 o superior, el sistema aplica el tema holográfico a cada actividad, y por tanto, cada actividad incluye la barra de acción.
Sin embargo, si se quiere utilizar los APIs de la barra de acción, como añadir pestañas o modificar los estilos de la barra de acción, hay que setear el android:minSdkVersion a "11", para poder acceder a la clase ActionBar.
Existe la posibilidad de utilizar Action Bar para SDKs cuya versión sea menor a 11, aunque para ello se debera usar la biblioteca Sherlook, aunque no trataremos este tema aqui.

Herramientas de diseño

Dado que el entorno de Eclipse es limitado y las herramientas que nos ofrece para diseñar nuestras aplicaciones a veces no son muy prácticas, a continuación mostraremos otras utilidades, fuera de Eclipse, que hay que reconocer que vienen muy bien.

Selección de los colores para nuestra aplicación

Color Scheme Designer es una aplicación online que viene a ayudarnos en esa tarea. El funcionamiento es tan sencillo como escoger un color base, y directamente se nos muestra una paleta monocromática con cinco tonalidades, que ofrecen un resultado elegante y sin sobresaltos visuales, incluso si se selecciona un color chillón. Además, bajo la propia paleta podemos ver dos ejemplos de como usar armónicamente esos colores para crear una página web con tonos claros u oscuros.


Action Bar


La action bar identifica la aplicación y la ubicación del usuario y proporciona acciones a los usuarios. Se debe utilizar la action bar en la mayoría de las actividades que deben presentar de forma destacada las acciones del usuario o la navegación global, debido a que la barra de acción ofrece a los usuarios una interfaz coherente entre las aplicaciones y el sistema se adapta con elegancia el aspecto de la barra de acción para diferentes configuraciones de pantalla. Se puede controlar el comportamiento y la visibilidad de la action bar con el API ActionBar , que se añadio en Android 3.0 (nivel de API 11).
Los objetivos principales de la action bar son los siguientes:
  • Proporcionar un espacio dedicado a la identificación de la marca aplicación y ubicación del usuario.
    Esto se logra con el icono de la aplicación o logo en el lado izquierdo y el título de la actividad. Usted puede optar por retirar el título de la actividad, sin embargo, la vista actual se identifica por una etiqueta de navegación, tal como la ficha seleccionada actualmente.
  • Proporcionar navegación consistente y ver refinamiento a través de diferentes aplicaciones.
    La barra de acción proporciona una función de navegación por pestañas para cambiar entre fragmentos. También ofrece una lista desplegable se puede utilizar como un modo de navegación alternativo o para afinar la vista actual (por ejemplo, para ordenar una lista por diferentes criterios).
  • Realiza acciones clave para la actividad (por ejemplo, "buscar", "crear", "compartir", etc) destacados y accesible para el usuario de una manera predecible.
    Puede proporcionar acceso instantáneo a las acciones del usuario mediante la colocación de los elementos clave del menú de opciones situado en la barra de acción, como "puntos de acción". Los elementos del menú que no sean promovidos a un elemento de acción están disponibles en el menú de desbordamiento.