miércoles, 7 de diciembre de 2016

PRIMEROS PASOS CON WEBPACK

Webpack es un sistema de bundling para preparar el desarrollo de una aplicación web para producción. En cierta medida se puede considerar un Browserify avanzado ya que tiene muchas opciones de configuración.

También se puede considerar una evolución de Grunt y Gulp, ya que permite de alguna manera automatizar los procesos principales que son transpilar y preprocesar código de .scss a .css, de ES7 a ES5/6, etc...

Para poder utilizar Webpack en tu proyecto web debes tener instalado Node.js en tu equipo y con el comando npm install -g webpack tendrás Webpack instalado de forma global en tu equipo (También puedes instalarlo a nivel de proyecto y correrlo con NPM scripts).

El comando más sencillo para realizar un bundle de tus archivos JavaScript es el siguiente:
$ webpack ./index.js ./build/app.js

Este comando lo que hace es leer tu fichero index.js que sería el principal de tu aplicación e importar todos los módulos que estén definidos y crear el fichero de "producción" app.js en la carpeta build.

Por supuesto esto se puede complicar mucho más. En lugar de escribir todo como comandos, podemos tener un fichero webpack.config.js donde escribamos toda la configuración que necesitemos.

Webpack permite que trabajemos con cualquier tipo de archivo (CSS, preprocesadores CSS, preprocesadores de JavaScript, imágenes, etc...) Con indicarle que loader debe utilizar e instalarlo, nos es suficiente.

Gracias a esto podemos por ejemplo preprocesar el código JSX de nuestros componentes de React facilmente. Veamos que fichero de configuración de Webpack debemos escribir para ello y a continuación te explico cada línea:



El fichero exporta un objeto JavaScript con las siguientes configuraciones:

resolve: {  
  extensions: ['', '.js', '.jsx']
},
context: __dirname  

Con esto le indicamos a webpack que se fije en los ficheros con extensión .js y .jsx desde el directorio en el que se encuentra el fichero webpack.config.js hacia dentro. El resto los va ignorar en el proceso de bundling.

entry: {  
  app: ['./index.jsx']
},

Aquí le indicamos que el punto de entrada desde el que debe empezar a leer y realizar el proceso es el fichero index.jsx

output: {  
  path: './build',
  filename: 'app.js',
  publicPath: '/build/
},

Con ésta configuración le estamos indicando donde ha de situarse el fichero de salida, y será en la carpeta build con el nombre app.js. Si lo servimos desde un servidor de desarrollo, la ruta pública será /build.

module: {  
  loaders: [
    {
      test: /(\.js|.jsx)$/,
      loader: 'babel',
      query: {
        presets: ['es2015', 'stage-2', 'react']
      }
    }
  ]
}

Llegamos a la parte más interesante, los loaders. Aquí en el objeto loaders podemos incluir tantos como queramos, dependiendo del tipo de archivo que queramos modificar. Podemos tener un loader para ficheros JavaScript y JSX como el ejemplo, podemos tener otro para ficheros de estilos y montar el CSS, podemos tener otro para imágenes, etc...

En este caso le estamos indicando con la expresión regular /(\.js|.jsx)$/ que a todos los ficheros con extensión .js y/o .jsx les pase el loader de Babel, que instalaremos con el paquete de npm babel-loader. Además le añadimos unas opciones de configuración a Babel con el objeto query. Le indicamos que utilice el preset de es2015 para transpilar la sintaxis de JavaScript que aún no soporten los browsers a la versión que si soportan, también el preset stage-2 que nos permite utilizar algunas cosas de la próxima versión de ECMAScript7, y por último el preset react que permite el preprocesamiento de JSX a JavaScript.
Para poder utilizar estos presets debemos instalar los siguientes paquetes desde NPM:

$ npm install --save-dev babel-cli
$ npm install --save-dev babel-preset-es2015
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-react

con esto, si corremos el comando webpack en nuestra terminal, tendremos el fichero final en pocos segundos. Si creamos un npm script con el comando:
"scripts": {
  "build": "webpack --watch --colors"
}
Al correr npm run build tendremos ejecutando webpack en modo watch lo que significa que a cada cambio que hagamos en nuestro código, webpack creará el bundle de nuevo pero de una manera más rápida que por ejemplo con Browserify o Gulp ya que lo mantiene en memoria. Y con el flag --colors vemos de una manera más gráfica el resultado en la consola:

> webpack --watch --colors

Hash: 29e741b4cf44e481459f  
Version: webpack 1.13.2  
Time: 7316ms  
 Asset    Size  Chunks             Chunk Names
app.js  751 kB       0  [emitted]  app  
   [0] multi app 28 bytes {0} [built]
    + 172 hidden modules

Webpack como servidor de desarrollo

También tenemos la opción de crear un servidor web de desarrollo con webpack. Para ello debemos instalar otra dependencia que es webpack-dev-server:
$ npm install --save-dev webpack-dev-server
Y modificar nuestro fichero webpack.config.js con el siguiente bloque:

devServer: {  
  host: '0.0.0.0',
  port: 8080,
  inline: true
},

Esto nos va a crear un servidor (basado en Node.js y Express) de desarrollo en local, en el puerto 8080que servirá nuestra carpeta build. Necesitaremos crear un sencillo fichero index.html en la carpeta /build con lo siguiente para poder ver el resultado en el navegador:

<!DOCTYPE html>  
<html lang="en">  
<head>  
  <meta charset="UTF-8">
  <title>Ejemplo Webpack</title>
</head>  
<body>  
  <script src="/build/app.js"></script>
</body>  
</html>  

Con esto y el comando webpack-dev-server corriendo tendremos un servidor mostrando el contenido de la caperta build y recreando el fichero de bundle en cada cambio que hagamos.
Para probar esto, tengamos por ejemplo en el fichero index.jsx lo siguiente:

import Persona from './persona'

const carlos = new Persona('Falcon')  
carlos.saluda()  
Y en el módulo persona.jsx lo siguiente:

export default class Persona {  
  constructor (nombre) {
    this.nombre = nombre
  }

  saluda () {
    console.log(`Hola! Soy ${this.nombre}`)
  }
}
En ambos ficheros no estamos utilizando React, pero si la extensión JSX y la versión ES2015 de JavaScript.

Al salvar estos ficheros, se recreará el bundle y si en el navegador escribimos la URL: http://0.0.0.0:8080/build veremos en la consola JavaScript del navegador el mensaje:

Hola! Soy Falcon  

A medida que vayamos desarrollando, creando componentes de React, ficheros CSS, etc... éste entorno de desarrollo nos agiliza el desarrollo y nos permite ir más rápido y enfocarnos en nuestro código.

Read More »

lunes, 7 de noviembre de 2016

React y ES6

React.js es una librería de JavaScript lanzada hace poco más de un año por Facebook, normalmente utilizada en el Frontend aunque puede ser utilizada en el Backend. Facebook la utiliza en producción para su red social en determinadas partes, como los comentarios y también en Instagram.

No se trata de un framework JS de cliente como pueden ser Angular, Backbone o Ember, si no de una librería que se encarga del renderizado de las vistas de una aplicación web. Es la V del patrón MVC por así decirlo.

Una de las primeras cosas que vi y no me gustaban mucho de React era que parecía que mezclaba el HTML con código JavaScript, pero cuando lo pruebas ves que no es así, si no que usa un transformador de código JSX (Creado por Facebook) a JavaScript para facilitarnos la vida a la hora de programar, por ejemplo este código de React usando JSX:

var Item = React.createClass({  
    render: function() {
        return <div>Hello Item</div>
    }
});
Y sin usar la transformación JSX sería así:
var Item = React.createClass({  
    render: function() {
        return React.createElement('div', {}, 'Hello Item'); 
    }
});
Commo puedes ver, se ve de una forma más clara con JSX lo que estamos renderizando que usando ECMAScript 5/6 puro, y eso que este ejemplo es pequeño, si estamos usando más elementos HTML, con clases, eventos, etc... se puede hacer inmanejable.

Principales características de React

DOM Virtual

Lo que ha hecho que React se vuelva trending es su velocidad de renderizado de vistas. Eso es posible gracias a un Virtual DOM que genera React con cada componente que creamos y el algoritmo de Diff que básicamente lo que hace es marcar que elementos dentro de nuestro DOM Virtual tienen cambios para renderizar solo ellos y no tener que revisar y repintar el DOM entero de nuestra página. Dónde más tiempo se pierde en una aplicación web es en el renderizado y pintado del DOM. React evita eso y por eso es tan rápido.

Diseño orientado a componentes

React nos obliga a pensar en componentes. Es la nueva tendencia en el mundo del desarrollo Frontend. Al igual que en el backend se tiende a usar micro-servicios y librerías que resuelvan una cosa concreta, en el Frontend cada vez más se está extendiendo ésta práctica de componetizar los elementos de nuestras aplicaciones para poderlos reutilizar.

Usando ES6 con React

Con React podemos usar el nuevo estándar ECMAScript 6 (o ECMAScript 2015) para escribir nuestras aplicaciones y con Babel y Browserify tener una versión traducida a ES5 que funcione en los navegadores actuales.

Si en nuestro index.html tenemos añadidos los enlaces a los scripts de React.js y JSX tranformer, un componente como el anterior en ES5 es así:

var ItemRow = React.createClass({  
    render: function () {
        return (
            <li className="Item-row">
                Elemento de una lista
            </li>
        );
    }
});
Usando ES6, e instalando las dependencias de React por npm, sería algo así:

import React from 'react'

class ItemRow extends React.Component {  
    render() {
        return (
            <li className="Item-row">
                Elemento de una lista
            </li>
        )
    }
}

export default ItemRow  

A mi me parece más claro lo que estamos haciendo utilizando ES6. Un componente de React es una clase, que hereda de un React Component. Importamos el módulo de React de forma nativa con el sistema de módulos de ES6 y también podemos exportarlo para utilizarlo en otra parte de la aplicación.

Para que esto funcione en un navegador moderno, podemos usar Gulp junto con unos plugins y tareas para crear la versión de producción. Primero necesitamos tener instaladas las siguientes dependencias:

$ npm install --save-dev browserify
$ npm install --save-dev babelify
$ npm install --save-dev vinyl-source-stream

Y el fichero Gulpfile.js con una tarea para hacer el build de la parte JavaScript/JSX sería:

// gulpfile.js

var gulp = require('gulp');  
var browserify = require('browserify');  
var babelify = require('babelify');  
var source = require('vinyl-source-stream');

gulp.task('build', function() {  
    browserify({
        entries: './src/index.jsx',
        extensions: ['jsx'],
        debug: true
    })
    .transform(babelify)
    .bundle()
    .pipe(source('bundle.js')
    .pipe(gulp.dest('./build'))
});

Esta tarea toma el fichero src/index.jsx, el principal de la aplicación para usar browserify. Después le aplica la transformación de babelify que no es más que traducir ES6 a ES5 y crea un fichero bundle.js con toda nuestra aplicación y dependencias listo para usar en el navegador.
Read More »

sábado, 10 de septiembre de 2016

Cuando Utilizar Em vs. Rem. Parte 1



Puedes haber entendido el uso de unidades flexibles de medida, pero podrías no haber entendido completamente cuando usar rem y cuando usar em. ¡Éste tutorial te ayudará a descubrirlo!

Tanto em como rem son flexibles, unidades escalables que son traducidas por el navegador en valores de pixeles, dependiendo de los ajustes del tamaño de la fuente en tu diseño. Si usas un valor de 1em o 1rem, pudiera traducirse en el navegador como cualquier cosa desde 16px hasta 160px o cualquier otro valor.





file
CSS padding establecido en 1 em 
 




file
Calcula a 16px 
 




file
CSS padding establecido en 1 em 
 


file
Calcula a 160 px



Por otro lado valores en px son usados por el navegador como son, así que 1px siempre se mostrará exactamente 1px.

Manipula el regulador deslizante en éste ejemplo en CodePen para ver como el valor de las unidades rem y em pueden traducirse en diferentes valores de pixeles, mientras explícitamente estableces las unidades en px fijas en tamaño:





La Gran Pregunta  

Usar unidades em y rem nos da flexibilidad en nuestros diseños, y la capacidad de escalar elementos hacia arriba y hacia abajo, en lugar de estar estancados en tamaños fijos. Podemos usar ésta flexibilidad para hacer nuestros diseños más fáciles de ajustar durante el desarrollo, más responsivo, y para permitir a usuarios de navegador controlar la escala general de sitios para máxima legibilidad. Las dos unidades em y rem proporcionan ésta flexibilidad y trabajar de formas similares, así que la gran pregunta es, ¿cuándo deberíamos usar valores em y cuando debemos usar valores rem? 

Diferencia crucial

La diferencia entre las unidades em y rem es como el navegador determina el valor px al que se están traduciendo. Entender ésta diferencia es la clave para determinar cuando usar cada unidad.

Vamos a comenzar sobre como trabajan las unidades rem y em desde cero para asegurarnos que conozcas cada detalle. Luego nos moveremos a por qué debes usar unidades em o rem.

Finalmente veremos la aplicación práctica de exactamente en que elementos de un diseño típico deberías usar cada tipo de unidad.

Como unidades rem se traducen a valores de pixel


Cuando se usan uniddes rem, el tamaño del pixel al que traducen depende del tamaño de la fuente del elemento raíz de la página, o sea el elemento html. Ese tamaño de fuente raíz es multiplicado por cualquier numero que está usando con tu unidad rem.

Por ejemplo, con un tamaño fuente de elemento raíz de 16px, 10rem debería equivaler a 160px, o sea 10 X 16 = 160. 

file



file

Como las Unidades em se traduce a valores de pixeles


Cuando se usan unidades em, el valor del pixel con el que terminas es una multiplicación del tamaño de fuente en el elemento al que se le está aplicando estilo.

Por ejemplo, si un div tiene un tamaño de fuente de 18px, 10em equivaldría a 180px, o sea 10 X 18 = 180.

file


file 

Es un mal entendido generalizado que las unidades em son relativas al tamaño fuente del elemento padre. De hecho, como lo especifica W3, son relativos al tamaño de fuente "del elemento en el que son usadas".

Los tamaños de la fuente del elemento padre pueden afectar los valores em, pero cuando eso ocurre es solamente por herencia. Veamos por qué, y cómo esto funciona en acción.

No te pierdas la parte 2 de este artículo.
 
Read More »

jueves, 14 de julio de 2016

Material Design

Material Design
Msc Gerardo López Falcón
A partir de la versión 5.0 de Android (API 21), se introduce Material Design. Se trata de una guía para el diseño visual de las aplicaciones, que Google no quiere aplicar exclusivamente a dispositivos móviles, sino que pretende utilizar material design en todo tipo de contenidos digitales (páginas Web, aplicaciones para ordenadores, vídeos,…).
Se basa en diseños y colores planos. Uno de sus principios es dar peso o materialidad a los elementos del interfaz de usuario. Para ello va a tratar de darle volumen o profundidad utilizando sombras, capas y animaciones. Observa como los botones flotantes (ver botón con estrella en el siguiente ejercicio) se visualizan con una sombra para que parezcan que están en una capa superior y suelen visualizarse con animaciones. La idea es que parezcan que están construidos de material físico. Para más información puedes consultar la especificación de Material Design que se incluye en enlaces de interés.

Ejercicio paso a paso: Una aplicación basada en Material Design
Cuando creas un nuevo proyecto con Android Studio, si escoges una actividad del tipo Blank Activity, tendrá un diseño inicial basado en Material Design. Esta actividad, utilizará un tema que hereda de android:Theme.Material. Además, se incorporan varios widgets basados en este diseño, como: Toolbar oFloatingActionButton, y se incluirán las dependencias adecuadas para poder usar estos widwets:
1.     Crea un nuevo proyecto con los siguientes datos:
Application name:Material Design
Package name:com.example.mislugares
2.     La aplicación solo va a ser para móviles, por lo que en la segunda venta has de marcar el primer checkbox:
Phone and Tablet
    Minimum SDK: API 15 Android 4.0.3 (IceCreamSandwich)
Recuerda que un aspecto delicado es seleccionar el SDK mínimo con el que trabajará la aplicación. Valores bajos te permiten instalarla en un mayor número de dispositivos, pero tendrás menos características disponibles en el API. Un valor adecuado que te permite cubrir casi todos los dispositivos actuales es API 15.
3.     En la siguiente ventana te pregunta si quieres añadir algún tipo de actividad a la aplicación. Indica:
Add an activity: Blank Activity
De esta forma se creará una actividad con diseño basado en Material Design. Dispondrá deuna barra de acciones y un botón flotante.
4.     En la última ventana te pedirá que configures algunos aspectos de esta actividad:
De arriba abajo corresponde al nombre de la clase Java donde se implementa la actividad, nombre del layout XML donde se define su aspecto visual, título de la actividad y fichero XML de menú donde se indica las opciones disponibles. Deja los valores por defecto.
5.     Ejecuta el proyecto. El resultado ha de ser similar al siguiente
6.     Pasemos a estudiar algunos elementos del proyecto. En el explorador del proyecto abre el fichero Gradle Scripts > build.gradle (Module:app). Observa como en la sección dependencies se han incluido las siguientes librerías:
  1. dependencies {
  2.    
  3.     compile 'com.android.support:appcompat-v7:23.2.1'
  4.     compile 'com.android.support:design:23.2.1'
  5. }

NOTA:Es interesante que utilices siempre la última versión disponible de las librerías (23.2.1en el ejemplo).Al crear un nuevo proyecto se realiza así. En lugar de añadir una dependencia editando directamente este fichero también puedesseleccionar File >Project Structure… >Modules: app >Dependencies >+ >Libray dependency > <librería>. La ventaja de esta opción es que usará laúltima versión disponible.
La primera es la librería de compatibilidad v7, que incorpora las clases más importantes como:AppCompatActivity, Toolbar o CardView. La segunda es la librería de compatibilidad de diseño. Incorpora otras clases como: FloatingActionButton, AppBarLayout, TabLayout, NavigationView oSnackbar. Gracias al uso de estas librerías podremos utilizar estas clases con un nivel mínimo de API 7, a pesar de que la mayoría han sido introducidas en la versión 5.0 de Android.
Hay una diferencia entre estas librerías: Las clases definidas en la librería de compatibilidad appcompat-v7son del API de Android. Cuando en una aplicación la versión mínima de API sea mayor o igual que 21 (v5.0) ya no tiene sentido usar esta librería. Por el contrario, las clases definidas en la librería de diseño son solo de esta librería. Has de usarla siempre que necesites una de sus clases.
7.     Pasemos a estudiar los layouts creados en el proyecto. En el explorador del proyecto abre el fichero app > res > layouut > activity_main.xml. En la vista Desig no se mostrará nada. Selecciona la vista Text pulsando sobre la lengüeta de la parte inferior.
8.     Estudia la estructura de este layout. Observa como las etiquetas de las vistas son muy largas. Esto es debido a que no están definidas en el API de Android si no en una librería (en concreto a las design).  La función de cada una de vistas se estudia en el siguiente apartado. Puede ser un buen momento para leerlo.
9.     Abre el fichero app > res > layouut > content_main.xml. Selecciona la vista Text pulsando sobre la lengüeta de la parte inferior. Se trata de un layout muy simple: un <RelativeLayout> con un <TextView> dentro.
10.     Abre ahora app > java > com.example.mislugares > MainActivity.java. En el método onCreate() se inicializan algunas de las vistas introducidas en el layout. Este código se explica en el siguiente apartado.
11.     Si al ejecutar la aplicación pulsas en los tres puntos de la esquina superior derecha, se mostrará un menú con la opción Settings. Como se ha definido este menú y otras opciones sobre la barra de acciones se explicarán más adelante.

Vistas de Material Design: CoordinationLayout, AppBarLayout, FloatingActionButton y SnackBar


Las animaciones son muy importantes en Material Design. Google quiere que los elementos del interfaz de usuario se muevan de forma coordinada, de forma que, al moverse un elemento, este puede desplazar a otro. Observa como al ejecutar el proyecto anterior, cuando pulsas el botón flotante se mueve hacia arriba mientras aparece un texto.
Para poder realizar esta animación, y alguna otra más, se utiliza CoordinationLayout. Es un descendiente deLinearLayout que nos proporciona un nivel adicional de control sobre las vistas que contiene para controlar su comportamiento y permite crear interdependencias. Este contenedor se suele utilizar como raíz del layout.
Para entender cómo se utiliza abre el fichero activity_main.xml. Observa cómo tras eliminar los atributos la estructura resultante es la siguiente:
El CoordinatorLayout actúa de contenedor y va a permitir que los elementos que contiene puedan realizar animaciones coordinadas. Mediante el atributo fitsSystemWindows podemos conseguir modificar la barra de estado del sistema. En concreto aplicando a esta barra el color colorPrimaryDark (azul oscuro en el ejemplo anterior), para que combine con el color de la aplicación colorPrimary (azul más claro en el ejemplo anterior). El uno de colores en Material Design se explica en el siguiente apartado.
El AppBarLayout también es un LinearLayout vertical y ha sido diseñado para usarlo dentro de unCoordinatorLayout. A su vez es habitual que contenga un elemento de tipo Toolbar y opcionalmente pestañas (TabLayout). Su finalidad es contener los elementos de la barra de acciones de la aplicación (conocida según la nueva nomenclatura de Material Design como AppBar). Gracias al atributo layout_scrollFlags podemos conseguir que los elementos de dentro de esta barra puedan desplazarse hasta que sean ocultados.
Dentro de AppBarLayout tenemos un Toolbar. Como veremos en breve es un nuevo widget que tiene la misma función que un ActionBar.
El contenido del layout que ha de visualizar la aplicación se incluye en un fichero aparte content_main. De esta forma queda más estructurado y podemos crear contenidos específicos según el tipo de pantalla, versión, … Observa como en el proyecto se ha creado un content_main que simplemente muestra el texto  “Hello World!”.
Tras el <include> se ha insertado un FloatingActionButton se trata de un tipo de botón característico introducido en Material Design para las acciones principales.
Otro aspecto que no hay que olvidar es que ahora hemos de inicializar desde código algunos elementos. Esto se realiza en el método onCreate() de la actividad:
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.     super.onCreate(savedInstanceState);
  4.     setContentView(R.layout.activity_main);
  5.     //Barra de acciones
  6.     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  7.     setSupportActionBar(toolbar);
  8.     //Botón flotante
  9.     FloatingActionButton fab = (FloatingActionButton) findViewById(
  10.                                                               R.id.fab);
  11.     fab.setOnClickListener(new View.OnClickListener() {
  12.        @Override
  13.        public void onClick(View view) {
  14.            Snackbar.make(view, "Replace with your own action",
  15.                   Snackbar.LENGTH_LONG).setAction("Action", null).show();
  16.        }
  17.     });
  18. }
Este código resultará más sencillo de entender, tras realizar el apartado Uso práctico de Vistas. Las dos primeras líneas han sido explicadas en la unidad anterior. El método setSupportActionBar() es utilizado para indicar a la actividad la barra de acciones que ha de utilizar. Esta barra de acciones es almacenada en el objeto toolbar, que es creado en el layout XML. Para encontrar el objeto se utiliza si id: R.id.toolbar.
Con respecto al botón flotante simplemente se carga en el objeto fab y se le asigna un escuchador onClick. Más adelante se describe el uso de escuchadores para personalizar la acción asociada. Actualmente, cuando se pulsa muestra un mensaje de texto utilizando un Snackbar. Se trata de una nueva forma de mostrar cuadros de dialogo, introducida en Material Desing, similar a Toast o AlertDialog. La diferencia es que se muestran en la parte inferior de la pantalla y que se visualizan con una animación de desplazamiento.
Ejercicio paso a paso: Barra de acciones extendida en Mis Lugares
En este curso vamos a crear una aplicación de ejemplo. Tendrá por nombre Mis Lugares y permitirá que los usuarios guarden información relevante sobre los sitios que suelen visitar (restaurantes, tiendas, etc.). En este apartado comenzaremos creando la aplicación Android que solo contendrá una actividad con una barra de acciones extendida.
La barra de acciones extendida es un patrón de diseño propuesto en Material Design que habrás observado en algunas aplicaciones actuales. Al entrar en la actividad la barra de acciones se muestra en modo extendido. Al desplazar el contenido la barra de acciones pasará al tamaño habitual.
Para conseguir este efecto has de utilizar el layout CollapsingToolbarLayout. En este ejercicio se describe cómo hacerlo:
1.     Crea un nuevo proyecto con los siguientes datos:
Application name:Mis Lugares
Package name:com.example.mislugares
Phone and TabletRPhone and Tablet
    Minimum SDK: API 15 Android 4.0.3 (IceCreamSandwich)
Add an activity: Scrolling Activity
Activity name: MainActivity
Layout name: activity_main
Title: MainActivity
Menu Resource Name: menu_main
De esta forma se creará una actividad similar a la que hemos creado en el ejercicio anterior. Igualmente dispondrá de una barra de acciones y un botón flotante. Pero ahora el contenido principal podrá desplazarse, a la vez que la barra de acciones reduce su tamaño.
2.     Ejecuta el proyecto y verifica su comportamiento:
3.     Nota: De momento quédate con los conceptos principales. Si en un futuro quieres modificar este comportamiento básico, puedes consultar la información necesaria.
4.     Compara los layouts creados para content_main.xml. Observa como ahora se utiliza el layout<NestedScrollView> para conseguir que el contenido sea desplazable. Además, el campo de texto es muy largo para conseguir que no quepa completo en pantalla.
Read More »