lunes, agosto 21, 2017

Android con Kotlin: Usando Lambda Expressions

Las expresiones lambda (o lambda expressions) que veremos en Kotlin, no son en realidad una completa novedad..., en Java se pueden usar y es algo que otros lenguajes como C# ya lo tienen desde aproximadamente el año 2006 (con .Net 3.0).

Pero, ¿que son las expresiones lambda?

Las expresiones lambda permiten pasar funcionalidad como argumento de una forma muy simple y sin tener que usar clases anónimas. Esto hace que simplifique mucho la codificación.

Supongamos que tenemos la siguiente función:

fun compare(a: String, b: String): Boolean = a.length < b.length

Mediante una expresión lambda se podría hacer los siguiente:

max(strings, { a, b -> a.length < b.length })

"max" es una función que toma el valor del segundo argumento, donde este segundo argumento es en sí, una función.

El formal en general de una expresión lambda es:

{
  param1, param2 -> //parámetros separados por coma
  param1 + param2 //código a ejecutar
}

Para terminar de ver esto con un ejemplo bien práctico, primero tomemos como referencia la implementación de un "OnItemClicListener" en un ListView en Java, tradicionalmente se vería de la siguiente manera:

mListView.setOnItemClickListener(new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view,
  int position, long id) {

  Log.d("onItemClick", "Se hizo clic") // Acá va la acción a realizar.

  }
});

Con un lambda expression en Kotlin, se simplificaría de esta manera:

mListView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->

    Log.d("onItemClick", "Se hizo clic") // Acá va la acción a realizar.

}

Como se puede apreciar, la diferencia en simplicidad y reducción de código es sumamente apreciable. No obstante, supongamos que view y id sean parámetros los cuáles no se les dará uso, la expresión podrían simplificarse aún más reemplazando esas argumentos que no estarán en uso por un "underscore":

mListView.onItemClickListener = AdapterView.OnItemClickListener { parent, _, position, _ ->

    Log.d("onItemClick", "Se hizo clic") // Acá va la acción a realizar.

}

Aún mejor, supongamos el siguiente clásico ejemplo del OnClickListener de un botón en Java:

button.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v){

doSomething();

}
});

En Kotlin, se reduce a una sola línea:

button.setOnClickListener({ view -> doSomething() })

Si los parámetros no son usados, directamente en lugar de reemplazarlos por un underscore, puede quitarlos, quedando:

button.setOnClickListener({ doSomething() })

Finalmente, como la función parámetro es única y el lambda también, puedo quitar los paréntesis quedando:

button .setOnClickListener { doSomething() }

Algo para destacar es que el mismo Android Studio nos va guiando y, si encuentra que podemos reemplazar el código que escribimos por una expresión lambda, nos lo siguiente actualizarlo en forma automática de la mano de la "lamparita amarilla" que usualmente aparece sobre el margen izquierdo de nuestro código.

Android Studio Kotlin Lambda Expression

Se puede ver un ejemplo completo e implementado de esto y otros temas más, en la siguiente aplicación que dejé completa en Github:


lunes, junio 05, 2017

Android: Comenzando con Koltin - Clases, Variables y el Safety Null

En mi artículo anterior (http://paveliz.blogspot.com.ar/2017/05/android-comenzando-con-kotlin.html) les dejaba no solo los primeros pasos para configurar Android Studio y poder comenzar a trabajar en Kotlin, sino también un ejemplo práctico (https://github.com/paveliz?tab=repositories), con el cual ya pudiesen ver y comparar lo que usualmente escribían en Java y cómo es que se escribe ahora en Kotlin.

Mi pendiente a comenzar a resolver en los siguientes artículos es comenzar a dejarles una base teórica con explicaciones puntuales del lenguaje y por supuesto, continuar dejando código útil en Github.

Entonces, comencemos a ver algunos temas propios del lenguaje:

Clases

En Java escribir una clase cuya función no es más quizás que describir un dato no es complejo, pero hay algunos elementos que debemos respetar, getter, setter, constructor, etc:

public class Alumno {

private Integer documento;
private String nombre;
private String apellido;

public Integer getDocumento() {
     return documento;
}

public void setDocumento(Integer documento) {
     this.documento = documento;
}

...

}

En Kotlin esto se resuelve de la siguiente forma:

open class Alumno constructor (
  var documento: Int,
  var nombre: String,
  var apellido: String
) {
  init {

  }
}

- Si el constructor principal no tiene ninguna annotation o modificador, la palabra "constructor" puede obviarse.
- El constructor principal puede no tener ningún código en particular, pero si se desea implementar una inicialización, se puede hacer en un bloque "init".
- Se genera automáticamente todas las propiedades, así como algunos métodos útiles como toString (), equals() y hashCode().

val nuevoAlumno = Alumno (1212, "Pepe Nombre", "Pepe Apellido")

Toast.makeText(this, "Propiedad Nombre: " + nuevoAlumno.nombre, Toast.LENGTH_LONG).show()

- Por default, todas las clases en Kotlin son como Java "final classes". El "open" delante de la clase justamente es lo opuesto al final y permite que pueda ser heredada.
- Obviamente si el constructor tiene argumentos, deberemos completarlos a la hora de aplicar la herencia.

class Pablo () : Alumno(1212, "Pablo", "Veliz")

Lo que teníamos como "métodos" en Java para darle cierta funcionalidad a nuestras clases, en Kotlin se llaman Functions (Funciones) y se precede por la palabra reservada "fun":

fun onCreate(savedInstanceState: Bundle?) {
...
}

En Kotlin, una función siempre retorna un valor, si no lo especificamos retorna Unit que sería el equivalente a "void" en Java. Solo que en Kotlin, Unit es un objeto. Si especificamos un valor de retorno quedaría:

fun calcularSuma ( a: Int, b: Int) : Int {
     return a + b
}

Otra cosa interesante que podemos hacer en Koltin es definir valor default para los argumentos:

fun calcularSuma ( a: Int, b: Int = 0 ) : Int {
     return a + b
}

Noten que entonces ahora, yo podría simplificar el tema y enviar solo el primer argumento a "calcularSuma", el segundo me lo toma por default como cero.

calcularSuma(2, 5)
calcularSuma(2)

var vs val

Como comenté en mi post anterior, Kotlin tiene de una forma más natural implementado los conceptos de "inmutabilidad" de las variables. ¿qué significa esto?, básicamente el concepto habla de que el valor de una variable NO pueda ser modificado luego de su inicialización. En Java, todas las variables/objetos mutan (a menos que estén indicadas explícitamente como "final"). Mutar significa básicamente, que cualquier otra parte del código podría modificar su valor.

En Kotlin usaremos "val" usualmente para justamente crear variables inmutables. De hecho, el propio Android Studio al ver que definimos una variable cuyo valor es luego modificado o caso contrario, nunca se modifica, hará automáticamente la sugerencia de cambiar un var a un val o viceversa.

Otro tema muy interesante en Kotlin es que NO necesito declarar los tipos, los mismos se infieren de su contenido.

// Variables Inmutables SIN Declaración de Tipo:
val pepe = "Algo"
val numero = 22

// Variables Inmutables CON Declaración de Tipo:
val otroPepe : String = "Algo"
val otroNumero : Int = 22

// Variables mutables
var pais = "Argentina"
var otroPais : String = "Argentina"


El famoso tema del Safety Null

Uno de los temas que más se comenta de Kotlin es que es "seguro" en el sentido de que no tiene previene los famosos "Null Pointer Exception" de Java. Es cierto..., aunque en realidad no es tan así. Para ejemplificar esto, lo voy a comentar aquí y dejé un ejemplo en Github ().

Cualquier operación que hagamos en Java con un elemento que puede llegar a tener un valor nulo, dará como resultado en Null Pointer Exception. Y esto es algo que, si bien podemos intentar predecir cuándo escribimos el código nos puede pasar igual y Android Studio o cualquier otro IDE de programación jamás nos dará advertencia alguna. Ejemplo:

public String nombre = null;

if (nombre.length > 0) {
...
}

PUM!!!

Definitivamente esto dará como resultado una excepción. Quizás no fue nuestra intención que nuestra variable "nombre" quedara en null, quizás fue producto de un "getStringExtra" que vino vacío justamente por haber olvidado validar un campo en el layout..., miles de razones pueden llevar a este conocido error.

Pero cuando desarrollamos en Kotlin, pasa lo siguiente:

var parametro: String? = null

La variable "parametro" se debe inicializar y si no sabemos si puede ser null o no, agregamos al final del tipo de dato el símbolo del signo de interrogación "?". Lo que le dice esto a Kotlin es: "bueno..., esta variable de tipo String podría tener un valor o podría ser null ¿quien sabe?".

Si luego quiero realizar una operación como con Java usando el lenght, tendremos el siguiente problema:

Automáticamente el mismo Android Studio nos dirá que hay un problema, ya que de entrada habíamos avisado que la variable podía contener nulos, no podemos entonces operar con la misma directamente. Algo que podríamos hacer sería esto:

var i: Int? = parametro?.length

¿que es esto? es una "safety operation" u operación "segura" como Kotlin lo llama. Básicamente, en ambos lados declaramos con el "?" que la operación puede dar null y esto NO dará Null Pointer Exception.

Si estamos completamente seguros que la variable es segura y no dará problema de nulos, Kotlin nos deja declararlo de la siguiente manera:

var i: Int = parametro!!.length

Noten que ahora, en lugar de usar el signo "?" usamos dos signos de explamación "!!". Con esto, lo que le estamos diciendo a Kotlin es: "Tranquilo, esta variable no tendrá NUNCA nulos y la operación es segura". Claro está, que si bien esto deja tranquilo y libre de warnings y errores a nuestro Android Studio..., si llegamos a fallar y la variable llega a tener un valor nulo...PUM! . En este caso tendremos un "Kotlin Null Pointer Exception"..., con lo cuál se darán cuenta

Una de las tantas formas correctas en las que deje implementado esto en el ejemplo en Github (https://github.com/paveliz/ClassesVarsValsyNullsEnKotlin), es la siguiente:

if( ! parametro.isNullOrEmpty() ) {

Java tiene un .isEmpty() pero si lo usan, la operación continuará dando NullPointerException. Pero Kotlin tiene un isNullOrEmpty() que realmente nos soluciona el tema de poder operar con nuestra variable siempre y cuando tenga algo y no sea nula.

En mi próximo post, continuaré con la introducción a nuevos elementos de este lenguaje.



domingo, mayo 28, 2017

Android: Comenzando con Kotlin

Si eres desarrollador Android sabrás que Google confirmó al lenguaje Kotlin como oficial para comenzar a desarrollar en Android.

¿significa que dejaremos de desarrollar en Java?..., en principio diría que no, porque Android Studio no reemplazará un lenguaje por otro sino que, Kotlin se incorpora como una opción, pero debo reconocer que estos cambios comenzarán a marcar una tendencia y eventualmente los desarrolladores comenzarán en forma "natural" a migrar o directamente a desarrollar en Kotlin y llegará el día en que nadie recuerde que Android se programaba en Java anteriormente, estoy seguro de esto y es hacia donde Google desea ir.

Pero al menos en este artículo no pienso bajar a detalle temas del lenguaje, lo voy a dejar para otro post, pero sí voy a atacar el ¿cómo comenzar con Kotlin? y dar un primer ejemplo práctico.

Mi recomendación, es que de todas formas comiencen a leer sobre el leguaje para comprender desde la base su estructura, la forma en la que fue pensado, qué elementos nuevos posee y esto les ayudará a poder pasar en forma más intuitiva de Java a Kotlin. Recuerden que Kotlin no es muy diferente a Java y funciona con la misma JVM..., pero nuevamente, dejaré esto para otro post.

Entonces, manos a la obra..., en primer lugar, no es necesario descargarse si o si la versión beta del Android Studio 3 para comenzar a trabajar en Kotlin, si bien fue una de las primeras cosas que hice por curiosidad de ver lo que se venía, pueden instalar el plugin de Kotlin y trabajar con la versión actual de Android Studio (que al día de este post es la 2.3.2).

Pueden seguir para esto los pasos de la siguiente guía:

https://www.slideshare.net/paveliz/androidkotlin-primeros-pasos

Que está basada en la guía del sitio de Kotling:

https://kotlinlang.org/docs/tutorials/kotlin-android.html

Cabe aclarar que cuando fui a buscar el plugin de Kotlin me encontré con 3 elementos..., el que deben instalar es el remarcado:


Una vez agregado, no se emocionen..., todavía no van a poder ver nada nuevo. Debe crear un nuevo proyecto o abrir alguno existente y al estar arriba cualquier Activity, si van al menú de Code en la barra superior verán una nueva opción que dice: Convertir a Kotlin:


Básicamente lo que hará esto es convertir el código de la Activity que por default está en Java:









..., en Kotlin:









Como un primer paso, les dejo un ejemplo que he subido a Github (https://github.com/paveliz/EjemploKotlin1). Tengo una Activity muy simple donde en el Layout puse un TextView, un EditText y un Button. Les quedará algo así:



En la Activity, como de costumbre, cree el método del botón:


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun clicBotonCambiar ( v : View) {

        val edtField = findViewById(R.id.editText) as EditText
        val txtField = findViewById(R.id.textView) as TextView

        txtField.text = edtField.text
    }
}


Noten que:

clicBotonCambiar

clicBotonCambiar no es un método, es lo que en Kotlin se llama un "Extension Function", que permiten agregar comportamientos a nuestra clase. Hay mucho para aclarar sobre esto, pero por ahora solo les digo que la ventaja del Extension Function es que puede "extender" una clase si necesidad de tener que pasar el objeto de la misma como argumento. El Extension Function actúa como si perteneciera a la clase.

Noten que en la definición de los argumentos, primero se coloca la variable, dos puntos y el tipo de dato de la misma (exactamente al revés de Java).

findViewById

Declarar un elemento del layout es muy simple, puede ser un "val" donde luego del findViewById hago el cast como "as [Object]".

Con "val" estoy definiendo un tipo de variable inmutable. La inmutabilidad es un nuevo concepto que viene con Kotlin. Un objeto inmutable es un objeto cuyo estado no puede cambiarse después de la instanciación.  Si necesita una versión modificada del objeto, debe crearse un nuevo objeto.

Los objetos "mutables" (como lo son por default en Java), se definen como "var".

txtField.text = edtField.text

Kotlin no tiene getters ni setters, por ende, todo lo que conocíamos como getText, getExtra, etc..., no está más y ahora se acceden como propiedades.

Procuraré lanzar un nuevo post con los detalles teóricos respecto de estos y otros grandes puntos del lenguaje Kotlin, pero al menos en este post me reservo esto, sin aturdirlos con la base teórica. El resultado es el mismo de siempre y dado que el ejemplo es muy simple no hay mucho truco, pero el tema es poder tener un primer acercamiento al código de Kotlin y pasar los temas que ya conocemos y son muy obvios para quienes venimos trabajando en Android con Java desde tiempo, a este nuevo lenguaje.

En breve, estaré subiendo más post relacionados a este tema ahondando más en el lenguaje, tema que - como comenté a principio de todo, les recomiendo comenzar a revisar tranquilos.


lunes, mayo 08, 2017

Para Google los colores son Importantes en Android

Dentro de lo que es el sitio de guía y especificaciones para Material Design (https://material.io/), Google introduce un set de herramientas muy útiles a la hora de evaluar tamaños de pantalla, animaciones, elementos que cambian de tamaño en pantalla y ahora colores. La herramienta COLOR TOOL (https://material.io/color/), permite seleccionar e indicar los colores para los elementos principales de tu aplicación y la misma herramienta luego aplica todas las tonalidades compatibles con cada elemento en pantalla, según su jerarquía y acorde justamente a lo que Material Design especifica.

Solo a modo de "repaso", Google introduce Material Design en el año 2014 con el objetivo de establecer un estándar de trabajo a la hora de diseñar las pantallas de una aplicación móvil (https://developer.android.com/design/material/index.html). Material Design no se limita a colores y fuentes..., establece parámetros animaciones, interacciones con el usuario e inclusive promueve el uso de una serie de componentes creados para tener una mejor interacción y visualización en aplicaciones Android (Themes, Toolbar, CardView, RecycleView, Shadows, tipos de Drawables nuevos, etc). Uno de los objetivos más importantes que se persigue es el desarrollo de una experiencia "unificada" a lo largo de la diferente variedad de dispositivos que existen.

COLOR TOOL es realmente una herramienta muy bien lograda y simple de usar. Con solo seleccionar un color de la paleta (o indicar uno propio por código), la herramienta presenta cómo queda aplicado ese color y diferentes tonalidades del mismo según la jerarquía de elementos en cada componente de Android. 



Se puede seleccionar cada color Primary, Sencodary, Text P y S y la herramienta mostrará como quedan combinados a lo largo de 6 tipos distintos de pantallas que contienen diferentes componentes de Android.





En la sección de "accesibilidad", la herramienta presenta textos en diferentes tamaños y contrastes de colores para dejar en claro qué elementos quedarán visibles y apreciables por el usuario en forma correcta y cuáles no. Esto nos permitirá corregir el color selecionado en el paso anterior.



domingo, febrero 12, 2017

Stetho: Debugging en Android igual que en Web

Recientemente tuve la oportunidad de participar en una charla brindada por el equipo de trabajo de Android en Facebook acerca de cómo trabajan, procesos y tecnologías que usan en la construcción de una de las aplicaciones más usadas y descargadas a nivel mundial.

Pero este artículo no es sobre esto, sino sobre un tema que fue arrojado al público presente como un "tip" de trabajo y me sorprendió ver que realmente muy pocos conocían. Y es el uso de Stetho.

Stetho surge justamente como una de los tantos proyectos del equipo de desarrollo de Facebook con la intención de mejorar su forma de trabajo, concretamente, de debugging de aplicaciones Android. Así es como también hay otros proyectos que han surgido por parte de ellos como React, redex, Fresco, makeitopen, etc (https://code.facebook.com/projects/).

Cuando te encuentras trabajando en un proyecto Android ¿quién no se ha encontrado con el problema de realizar un buen proceso de debug de servicios rest y poder analizar los elementos que la app transfiere por HTTP ¿quién no se ha encontrado con el problema de poder acceder a los datos de SQLite?...y no tener que hacer cosas como acceder a los archivos, descargarse la base al escritorio y abrirla con un motor de SQLite local para poder ver lo que la app pudo guardar o no.

Para hacer una analogía práctica Stetho nos da el mismo el mismo beneficio que el "inspect" que usamos en Chrome cuando desarrollamos web..., de hecho, la solución se basa en el mismo concepto. Aquí en el screenshot se puede visualizar un ejemplo de esto que hablo. Todos los elementos de la app, bajo la misma consola de desarrollo que tiene Google Chrome.

Stheto Inspect
Stetho Inspect


¿cómo se usa esto?

Primero debemos agregar Stetho al Gradle:
compile 'com.facebook.stetho:stetho:1.4.2'
Sugiero también agregar:
compile 'com.facebook.stetho:stetho-js-rhino:1.4.2'
Nota: Esta es una de las opciones que Stetho tiene y es la más general. Luego tiene otras inclusiones particulares relacionadas al debuggin de HTTP. Para más detalles de esto ver los ejemplos y código en el sitio.

Luego, inicializamos el comoponente con esta línea:


public class MyApplication extends Application {
  public void onCreate() {
    super.onCreate();
    Stetho.initializeWithDefaults(this);
  }
}

Y listo!

Para probar su funcionamiento, debemos correr nuestro proyecto sea en un equipo o en un emulador y abrir Chrome. Una vez ahí, debemos colocar:

chrome://inspect/#devices

Ahí aparecerá nuestra aplicación y un link que dice "inspect", al hacer clic se abrirá otra pantalla con el conocido inspect de Chrome pero con todo el contenido de nuestra aplicación.

Chrome Inspect
Chrome Inspect


Entre las acciones más importantes y que en lo particular a mí me han sido de gran utilizar, puedo inspeccionar los recursos pudiendo acceder a los archivos de SharedPreferences y sobre todo a la base de datos de SQLite:

Stheto Inspect SharedPreferences SQLite
Stetho Inspect SharedPreferences, SQLite


No solo puedo ver la o las bases de datos que mi aplicación esté usando sino también las tablas y acceder a la edición del contenido mediante la escritura de consultas SQL. El otro punto que me ha sido de gran utilidad es el poder inspeccionar la interface de usuario igual que cuando hacemos debug de una página web. Stetho me muestra el árbol de componentes pudiendo acceder al detalle de cada uno:
Stheto Inspect UI
Stetho Inspect UI

Hay mucho más para investigar, pero Facebook lo tienen muy bien explicado en sus respectivas URL de referencia, espero lo usen y les sea tan útil como a mi.


http://facebook.github.io/stetho/

https://github.com/facebook/stetho

martes, septiembre 29, 2015

Android: Mudando del Actionbar a la Toolbar de Material Design

Dentro de todas las novedades que trajo Material Design no solo en cuanto a la especificación de "formas" y regla bajo las cuales trabajo, también hay nuevos elementos y uno de ellos es la Toolbar.

El objetivo de este ejemplo que he desarrollado y puesto en github, es mostrar un Actionbar con varios acciones implementado en forma tradicional y lo simple que es migrar esto al Toolbar de Material Design.


Actionbar

En primer lugar, desarrolle una Activity con un Action bar que tiene varias acciones, una de las cuáles inclusive es el widget de búsqueda.

<item android:id="@+id/action_settings"    android:title="@string/action_settings"    app:showAsAction="never" />

<item android:id="@+id/action_about"    android:title="@string/action_about"    app:showAsAction="never" />

<item    android:id="@+id/action_search"    android:title="@string/action_share"    android:icon="@drawable/ic_dark_search"    app:showAsAction="always"    app:actionViewClass="android.support.v7.widget.SearchView"    />

Noten que el último ítem tiene la propiedad "app:actionViewClass="android.support.v7.widget.SearchView ", lo cuál indica que voy a usar un widget de Search.

La Activity principal no tiene grandes cambios, tiene los métodos principales que requiere el menú:

public boolean onCreateOptionsMenu(Menu menu)

public boolean onOptionsItemSelected(MenuItem item)...

En el OnCreate, agregué 3 detalles para hacer mas interesante la barra como por ejemplo, quitar el título y poner un icono:

getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setIcon(R.drawable.ic_app);

En la sección de estilos por el contrario, sí hay un par de puntos interesantes.

En primer lugar generé un recurso para especificar los colores y luego llamarlos desde los estilos:

<resources>
    <color name="colorPrimray">#03A9F4</color>
    <color name="colorPrimrayDark">#0288D1</color>
    <color name="colorPrimrayLight">#B3E5FC</color>
    <color name="colorAccent">#FFD740</color>
</resources>

Luego, genere un estilo específico para aplicar a esta Activity. Noten también que mi estilo generado deriva de AppCompat, para garantizar compatibilidad con las diferentes versiones de Android:

<style name="CustomActionBarTheme"    parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/MyActionBar</item>

    <!-- Support library compatibility -->    <item name="actionBarStyle">@style/MyActionBar</item>
</style>

<!-- ActionBar styles --><style name="MyActionBar"    parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/colorPrimray</item>

    <!-- Support library compatibility -->    <item name="background">@color/colorPrimray</item>
</style>



Migrando a Toolbar

Finalmente, generar una Acitivity con la Toolbar, no es nada complejo. Sobre todo y lo más importante, es que no se pierden los items y la funcionalidad del menú realizado anteriormente.

Primero de todo, incluimos la Toolbar en el Layout de la Activity:

<android.support.v7.widget.Toolbar    android:id="@+id/toolbar"    android:layout_width="match_parent"    android:layout_height="?attr/actionBarSize"    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <ImageView        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:src="@drawable/ic_app"        android:scaleType="center"/>
</android.support.v7.widget.Toolbar>

Noten que ya no necesito incluir el icono por código, sino que puedo hacerlo desde el mismo layout con un ImageView.

En la hoja de estilos, aplique un estilo específico para la Toolbar:

<!-- Activity with Toolbar style. --><style name="AppSecondTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimray</item>
    <item name="colorPrimaryDark">@color/colorPrimrayDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="toolbarStyle">@style/Toolbar</item>
</style>

<!-- Toolbar style. --><style name="Toolbar" parent="Widget.AppCompat.Toolbar">
    <item name="android:background">?attr/colorPrimary</item>
    <item name="popupTheme">@style/Theme.AppCompat.Light</item>
</style>

En el OnCreate, llamamos e incluimos la Toolbar:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

Y listo!!!




Los métodos del menú no cambian y se mantienen. Noten que el menú con el Widget de búsqueda sigue funcionando exactamente igual.

jueves, junio 26, 2014

NFC, oportunidades que no se deben perder de vista


El avance y la penetración en el mercado de equipos con NFC es cada vez mayor y ya no se puede negar que su uso, abre un mundo de posibilidades para todo lo que es medios de pago e intercambio de información con dispositivos móviles.

De acuerdo con las últimas proyecciones del IHS Technology, los equipos con NFC, alcanzarán 1.2 billones para el año 2018. Solo en el último año 2013, los dispositivos con NFC habilitado alcanzaron los 275 millones de unidades, siendo este número de 120 millones en el 2012, un 128% de crecimiento. En el 2014, se espera se expanda un 50% alcanzando los 416 millones.

NFC está integrado en el 18.2 % de los 1.5 billones de equipos en el mundo. En el 2018, se espera alcance el 64%.

Pero ¿qué es esto? y ¿porque darle importancia?

Brevemente, NFC o Near Field Communication (Comunicación de Campo Cercano), permite la comunicación de datos entre dispositivos que se encuentren muy cerca. La comunicación entre los pares se realiza muy rápido, a diferencia de Bluetooth o WiFi donde la conexión requiere claves y elementos que lo hacen menos dinámico.

El éxito del estándar se ha dado en la implementación de medios de pago en forma inalámbrica utilizando dispositivos móviles habilitados. Google ya permite realizar pagos por NFC a los usuarios que hayan configurado su Google Wallet. Así también, en varios países de Europa, ya se puede utilizar NFC para el pago en los medios de transporte. NFC también permite el intercambio rápido de información como contactos, fotos, videos y todo tipo de archivos.

Según el ABI Research, “Mas de 34 billones de tickets serán adquiridos por dispositivos móviles en los próximos 5 años”.

Tenemos un enorme público consumidor que ya dispone de dispositivos habilitados para usar esta tecnología y un sin fin de posibilidades, desde el simple hecho de poder pagar Colectivos, Subte, Trenes y todo medio transporte en forma fácil, hasta el hecho - porque no - de poder tener terminales de pago en Supermercados, comercios, estadios y teatros.

Está claro que oportunidades en el uso de esta tecnología que está cada vez más disponible hay muchas, solo hacen falta buenas ideas y la ayuda de las empresas para poder implementarlas.

Para aquellos que quieran saber con exactitud si su equipo tiene o debería tener NFC habilitado, en este link encontrarán el listado actualizado y oficial de equipos NFC compatibles:

http://www.nfcworld.com/nfc-phones-list/


Referencias:
http://en.wikipedia.org/wiki/Near_field_communication
http://www.mobilemarketingwatch.com/why-mobile-marketers-shouldnt-take-their-focus-off-of-nfc-39966/
http://www.nfcworld.com/2014/02/17/327868/nfc-account-30-mobile-tickets/

jueves, abril 11, 2013

ADN Emprendedor: No solo cuenta tener una idea también cuenta tener buenos contactos


¿Cuantos podrían llegar y cuantos son los que realmente llegan? es la pregunta que me vino a la mente hace un tiempo pensando en los deportistas profesionales. ¿es solo cuestión de perseverancia? ¿contactos? ¿recursos?...o quizás ese factor “suerte” que todos necesitamos.

Lo mismo pasa en el mundo de los emprendedores. Y no solo cuenta tener una idea sino también tener el coraje de seguirla y la ayuda de las personas adecuadas para poder plasmarla en el mundo real.

¿Quién fue realmente el que vio el potencial de Facebook? porque inclusive Mark sabía que había algo bueno pero no tenía muy en claro que hacer con él. Ahí es donde entra en escena el ex Napster Sean Parker. Un personaje polémico, con la basta experiencia de haber desarrollado un producto, enfrentado inversores, empresas grandes, juicios e inclusive haber perdido. Pero con la comprensión de como un empresario ve un producto y también como ven al emprendedor. 

Sean no solo vio el potencial de Facebook sino también tenía un conocimiento que le ayudaría a realizar un aporte "clave" al proyecto, y así fue. Facebook gana el primer capital inversor de la mano de contactos de Sean.

El “emprender” es un proceso de descubrimiento. En la época de la fiebre del oro los descubridores perseveraban hora tras hora colando el agua para tratar de descubrir el oro. Perseverar, analizando nuestras ideas, sacándolas del papel y poniéndolas en la vidriera.

"The best way to have a good idea is to have lots of ideas." (La mejor forma de tener una buena idea es tener muchas ideas), Linus Pauling

Lanzamiento: ¿qué es lo importante del lanzamiento de mi idea? ¿realizar un desarrollo extenso y complejo o buscar salir rápidamente para dejar probar al mundo la idea?. Hay que darlo a conocer! Se necesita feedback rápido!

“La primera versión de Grooveshark era un Frankenstein… Pero siempre va a ser mejor tener que reconquistar a un público más tarde, que quedarse años pensando en un concepto perfecto que tal vez nunca va a estar listo”, Andrés Barreto.

Amigos, Contactos y Socios: ¿Cuanto estoy haciendo hoy por mi perfil? (ver: Personal Branding hoy más que nunca!) o quizás si este ejercicio no me es fácil ¿cuánto estoy haciendo por mis relaciones? esas que luego ayudarán a enriquecer el emprendimiento agregando visión, consejos y más contactos. Emprender es también saber compartir. Tuve oportunidad de escuchar de primera mano el consejo de "Alec Oxenford", Co-Founder y  Co-CEO de OLX acerca de emprender, compartir y tener un socio: "Es preferible tener parte de la ballena que el 100% de la mojarrita", nos compartió con mucha gracia.

“He sido bendecido de encontrar gente más inteligente que yo, y ellos me ayudan a ejecutar la visión que tengo”, Russell Simmons. Fundador de Def Jam Records.

Yo creo que estas componentes son las que en conjunto hacen crecer una idea, un emprendimiento y son clave en su posible éxito.

Por último les dejo un ejemplo muy práctico sobre este tema que pude vivir en primera fila de la mano de un proyecto llamado Liibook sobre el cuál espero realizar un post específico más adelante. Federico Roma (fundador), Diseñador Gráfico talentoso y visionario tuvo una idea…, la de una plataforma de publicación de libros disponible en la web y abierta para todo el mundo. Así pues, armado solo de la idea busco 2 relaciones claves que lo apoyaron desde el pilar de los negocios, la introducción al mercado y desde el punto de vista tecnológico para poder realizar al menos la primer implementación.

Lo mas importante del emprendimiento fue el apostar a una idea y las relaciones que hicieron que esa idea pudiera llegar a algo. Un año después de haber ganado Wayra, la rueda en Sillicon Valley y su presentación en el TechCrunch 2012, Liibook pone un pié en San Francisco donde espera asentarse y recibir inversiones que le permitan seguir creciendo. Todo esto se logró gracias a la visión de Federico y el depositar la confianza en relaciones que supieron apoyarlo y ayudarlo.

lunes, marzo 11, 2013

Publicar mi App Mobile: Imágenes, iconos y tamaños a tener en cuenta


Ya sea desarrolladores, agencias, grandes empresas o individuos tratando de realizar el lanzamiento de su aplicación mobile, todos se encuentran con el mismo problema: la inmensa cantidad y variedad de tamaños de imágenes a iconos que se deben generar - y en diferentes formatos - para poder cerrar la aplicación y publicarla.

He aquí entonces un resumen acerca de todos los elementos a tener en cuenta a la hora de adentrarse en el mundo de la publicación de aplicaciones móviles.

iOS (Apple)

Apple App Store
El caso de Apple es "relativamente" sencillo, no por la cantidad de imágenes que se deben generar, sino porque las mismas se insertan directamente en el proyecto por medio de la interface de desarrollo (Xcode) y son pocas las imágenes que debemos tener a mano a la hora de publicar la aplicación a parte de los los print-screen o pantallas promocionales que hayamos confeccionado. Aún así la variedad de imágenes es grande dependiendo si la aplicación será compatible con iPhone, iPad, retina display y iPhone 5. Respecto del iPad mini, no es necesario tener consideraciones especiales ya que usa los tamaños del iPad 1 y 2.

iPhone App

App Icon: 57 x 57
App HD: 114 x 114

Launch Images:
320 x 480
640 x 960
640 x 1136 (iPhone 5)

iPad App

App Icon: 72 x 72
App Icon HD: 144 x 144

Launch Images (Portrait)
768 x 1004
1536 x 2008

Launch Images (Landscape)
1024 x 748
2048 x 1496

Pero como comenté al principio, todas estas imágenes se agregan con un simple "drag & drop" dentro del Xcode. Ahora bien, cuando estoy en el proceso de publicación, aparecen una serie de nuevas imágenes a tener en cuenta (información tomada directamente del formulario de publicación).

Large App Icon
A large version of your app icon that will be used on the App Store. It must be at least 72 DPI, in the RGB color space, and 1024 x 1024 pixels (it cannot be scaled up). The file type must be .jpeg, .jpg, .tif, .tiff, or .png. It must be flat artwork without rounded corners.

3.5-Inch Retina Display Screenshots
Screenshots for 3.5-inch iPhone and iPod touch Retina display must be 960x640, 960x600, 640x960 or 640x920 pixels, at least 72 DPI, in the RGB color space, and in the JPG or PNG format.

4-Inch Retina Display Screenshots
Screenshots for 4-inch iPhone 5 and iPod touch (5th generation) Retina display must be 1136x640, 1136x600, 640x1136 or 640x1096 pixels, at least 72 DPI, in the RGB color space, and in the JPG or PNG format.

iPad Screenshots
iPad Screenshots must be .jpeg, .jpg, .tif, .tiff, or .png file that is 1024x768, 1024x748, 768x1024, 768x1004, 2048x1536, 2048x1496, 1536x2048 or 1536x2008 pixels, at least 72 DPI, and in the RGB color space.

Routing App Coverage File (Optional)
Routing app coverage files are .geojson files which specify the geographic regions supported by your app. The file can have only one MultiPolygon element. MultiPolygon elements consist of at least one Polygon. Polygons contain at least four coordinate points. Polygon start and end coordinate points must be the same.

Android

Google Android Play Store
Es el caso inverso de iOS, en Android la plataforma solo nos pide el icono de la aplicación en diferentes densidades. ¿para qué esto? Como sabrán el universo de Android es basto y plagado de diferentes equipos de diferentes marcas que inclusive han hecho uso de las diferentes versiones del sistema operativo del robot verde. Según el tamaño de pantalla y resolución, todas las imágenes deben estar en diferentes densidades: ldpi (low dpi), mdpi (middle dpi), hdpi (high dpi) y xhdpi (x-high dpi). Como este punto no es el foco de nuestro tópico les dejo un link para que puedan indagar mas sobre el tema.


icon drawable-hdpi: 72 x 72
icon drawable-ldpi: 36 x 36
icon drawable-mdpi: 48 x 48
icon drawable-xhdpi: 96 x 96

Lo cierto es que a la hora de subir la aplicación nos encontramos con que el Market de Android nos pide varias imágenes de las cuales muchas son mandatorias.

Screenshots: 320 x 480, 480 x 800, 480 x 854, 1280 x 720, 1280 x 800 24 bit PNG or JPEG (no alpha) Full bleed, no border in art.

High Resolution Application Icon: 512 x 512 32 bit PNG or JPEG Maximum: 1024 KB

Promo Graphic (opcional): 180w x 120h 24 bit PNG or JPEG (no alpha) No border in art

Feature Graphic (opcional): 1024 x 500 24 bit PNG or JPEG (no alpha) Will be downsized to mini or micro

Windows Phone

Microsoft Windows Phone Market Place
La nueva plataforma de Microsoft tiene un "mix" interesante sobre las dos anteriores. A la hora de construir la aplicación el Visual Studio nos deja 3 imágenes a modo de ejemplo que luego hay que reemplazar:

Application Icon: 62 x 62 px
Slash Image: 480 x 800 px
Background (tile): 173 x 173 px

Estas imágenes ya vienen con la estructura base del proyecto, nosotros solamente debemos reemplazarlas con las finales y diseñadas para nuestra aplicación (obviamente respetando los tamaños). Adicionalmente, cuando se sube la aplicación el marketplace de Microsoft nos pide algunas imágenes y realiza varias validaciones a tener en cuenta:

Tile Icon 300 x 300 px (obligatorio)
Background Image 1000 x 800 px (opcional)
Screens 480 x 800 px

Específicamente Microsoft pide que las pantallas de la aplicación sean capturas realizadas con el emulador y NO imágenes armadas o diseñadas. Otro detalle, es que si la aplicación se encuentra en varios idiomas las capturas también se deben realizar en cada idioma y esto es mandatorio. Un punto muy diferente a cualquiera de los anteriores. Esto se valida en el proceso de publicación y es razón suficiente para no dejar pasar la aplicación al store.


A continuación les dejo un link que compartió conmigo Lucas Veliz, Diseñador gráfico especializado en temas de mobile (@lucasveliz84) el cuál permite en forma automática generar todas las imágenes necesarias para iOS y Android partiendo de una inicial, para usarlo necesitan Photoshop e Illustrator.