Archivo por meses: enero 2014

text-decoration none no funciona

El otro día tuve un problema con un enlace en html cuyo text-decoration none no funciona.

Quería que el enlace en cuestión quitara el subrayado cuando el ratón pasara por encima y le apliqué el siguiente estilo css a su clase:


...

text-decoration:none;

...

Era muy extraño pero esto no funcionaba así que decidí aplicárselo al elemento directamente con firebug pero… ¡seguía sin funcionar!

Después de darle muchas vueltas llegué a pensar que se le estaba aplicando este estilo a través de javascript pero la solución era la hoja de estilos ya que no me había percatado de que se le estaba poniendo un border-bottom:


...

border-bottom: 1px solid black;

...

Simplemente le quité esta propiedad y conseguí solucionar el problema.

Fallo tonto 🙂

Componentes y controles en Android (GUI Widgets)

En este post explicaremos algunos componentes de la interfaz llamados también GUI Widgets o controles. Componentes de este tipo serían por ejemplo: cajas de texto, botones, calendarios… Los widgests se pueden insertar en los diferentes layouts que explicamos en el post anterior.

Los componentes estarán disponibles en la barra de herramientas del diseñador de Eclipse. Cada componente estará asociado a una clase Java disponible en la documentación JavaDoc.

Entre los más usados se encuentran los siguientes controles:

  • Botón: android.widget.Button
  • Calendario: android.widget.CalendarView
  • CheckBox: android.widget.CheckBox
  • Selección de fechas: android.widget.DatePicker.
  • Caja de texto: android.widget.EditText
  • Botón con imagen: android.widget.ImageButton
  • Image: android.widget.ImageView
  • Información de progreso: android.widget.ProgressBar
  • RadioButton: android.widget.RadioButton
  • Menú desplegable: android.widget.Spinner
  • Etiqueta de texto: android.widget.TextView

Cada widget contiene sus propios atributos y eventos, por ejemplo, el widget botón tiene, entre otras, una propiedad para establecer el texto del botón así como un evento de pulsación mientras que el widget caja de texto puede establecer mediante la propiedad inputType el tipo de entrada que permite introducir (numérico, fecha, email…).

Un ejemplo común de un widget en marcación xml sería por ejemplo:


<Button
android:id="@+id/dummy_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Enviar" />

Layouts en android o cómo organizar los componentes en la pantalla

Existen multitud de tipos de layouts para ordenar los componentes en una pantalla. A continuación explicaremos algunos de los más comunes:

  • LinearLayout: consiste en agrupar los elementos uno detrás de otro de forma horizontal o vertical.
  • TableLayout: este layout permite agrupar los elementos en una tabla que contiene filas y columnas.
  • RelativeLayout: los elementos se ubican dada una posición relativa de otro elemento del mismo layout.
  • FrameLayout: ubica todos los elementos alineados sobre la esquina superior izquierda de manera que unos controles quedarán encima de otros.
  • ScrollView: se puede utilizar cuando el número de componentes de una pantalla se desborda y es necesario un scroll vertical.

Todas estas clases heredan de la clase View o ViewGroup. De esta manera heredarán a su vez una serie de propiedades comunes:

  • layout_width: anchura
  • layout_height: altura
  • layout_marginTop: margen superior
  • layout_marginBottom: margen inferior
  • layout_marginLeft: margen izquierdo
  • layout_marginRight: margen derecho
  • layout_gravity: orientaciones vertical y horizontal del elemento
  • layout_weight: peso
  • layout_x: coordenada x donde ubicar el elemento
  • layout_y: coordenada y donde ubicar el elemento

La manera de utilizar estos layouts será mediante marcación XML en el fichero layout correspondiente a cada actividad. Por ejemplo:


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0099cc"
tools:context=".FullscreenActivity" >

<!--
The primary full-screen view. This can be replaced with whatever view
is needed to present your content, e.g. VideoView, SurfaceView,
TextureView, etc.
-->

<TextView
android:id="@+id/fullscreen_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:keepScreenOn="true"
android:text="@string/dummy_content"
android:textColor="#33b5e5"
android:textSize="50sp"
android:textStyle="bold" />

<!--
This FrameLayout insets its children based on system windows using
android:fitsSystemWindows.
-->

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" >

<LinearLayout
android:id="@+id/fullscreen_content_controls"
style="?buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:background="@color/black_overlay"
android:orientation="horizontal"
tools:ignore="UselessParent" >

<Button
android:id="@+id/dummy_button"
style="?buttonBarButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dummy_button" />
</LinearLayout>
</FrameLayout>

</FrameLayout>

Ciclo de vida de una actividad en Android

Cuando se lanza una actividad en android implica que la actividad anterior sea parada temporalmente. Esto no significa que la anterior actividad sea destruida sino que simplemente pierde el foco y se puede recuperar al volver a ella (botón back). Las  actividades solo son destruidas cuando el sistema así lo decida para resolver problemas de memoria. La preocupación del programador debe de centrarse en que la aplicación esté disponible cuando el usuario pulse el botón volver. La práctica más habitual es guardar el estado de la aplicación cuando ésta pierda el foco y recuperar su estado cuando vuelva a recuperar el foco.

Una actividad puede pasar por 3 estados diferentes:

  • Activa: la pantalla o actividad se encuentra visible por el usuario.
  • Pausada: la actividad ha perdido el foco pero sigue visible total o parcialmente por el usuario. Un ejemplo sería una ventana de diálogo que contiene el foco pero que está ligada a la actividad principal.
  • Parada: la actividad no está visible.

El ciclo de vida de una actividad contiene los siguientes métodos:

  • onCreate: se invoca cuando la actividad se crea por primera vez. Es aquí donde deberemos inicializar los datos que contendrá así como sus vistas. De esta manera es importante sobreescribir este método cada vez que definamos una actividad. El método recibe un parámetro de tipo Bundle. El valor de este parámetro será nulo si se ejecuta por primera vez pero en cambio contendrá la información suficiente para restaurar la actividad en caso de recuperación.
  • onRestart: se llama a este método cuando la actividad había sido detenida previamente pero se va a volver a visualizar.
  • onStart: este método se ejecuta cuando la actividad va a ser visualizada.
  • onResume: este método se ejecutará siempre que la aplicación este preparada para interactuar con el usuario. Este es el lugar idóneo para inicializar datos.
  • onPause: se invoca cuando la actividad va a perder el foco. Podemos ver este método como un aviso de que la pantalla va a dejar de ser visible y por tanto es un lugar idóneo para guardar el estado de la actividad.
  • onStop: se llama a este método cuando la actividad ha sido ocultada por completo.
  • onDestroy: método por el que pasa cuando la actividad va a ser destruida por completo.

Qué son las actividades en Android

En este post intentaremos explicar qué son las actividades en Android.

Una actividad es una pantalla que en algún momento podrá ser visualizada por el usuario. Una aplicación en android tendrá entre 1 a N actividades.

Es en una actividad (pantalla) donde se colocarán los diferentes componentes como son los controles: caja de texto, botón, cuadros de selección (checkbox), listas desplegables…

Cuando creamos un nuevo proyecto android desde eclipse entre otras cosas tendremos la opción de indicarle cual será el nombre de la actividad principal (pantalla de inicio) desde la cual se arrancará nuestra aplicación.

Cada una de las pantallas que creemos deberán extender a la clase Activity. Si nos fijamos al extender esta clase también podremos sobreescribir algunos de sus métodos entre ellos está el siguiente:

  • OnCreate, se ejecutará al iniciar la aplicación. En este método se suele iniciar el layout o clase que contiene el diseño de la pantalla.

setContentView(R.layout.mi_actividad);

 En posteriores posts hablaremos del ciclo de vida de las actividades.

Dimensiones de pantallas Android

Las aplicaciones deben de ser capaces de adaptarse a las pantallas con diferentes resoluciones. Android clasifica los tipos de pantalla por densidades y no por pixels (afecta tanto el tamaño de la pantalla como la relación de aspecto).

La unidad de medida, por tanto, será la densidad de pixels o dpi.

Los tipos de pantalla se dividen en los siguientes grandes grupos acorde a su densidad:

  • baja: ldpi (120dpi)
  • media: mdpi (160dpi)
  • alta: ldpi (240dpi)
  • muy alta: xhdpi (320dpi)

A nivel práctico esto supone que deberíamos disponer de una misma imágen con cuatro tamaños distintos para mantener la relación de aspecto. En un proyecto android deberemos tener una carpeta de recursos por cada grupo y en ella colocar la imágen que corresponda a cada una.

Es decir es necesario trabajar para las distintas dimensiones de pantallas Android.

Desplegar aplicaciones android en un entorno real con Eclipse

De la misma manera que podemos utilizar un simulador virtual para desplegar nuestras aplicaciones android podemos instalarlas en un dispositivo real mediante un cable USB. Para ello debemos tener instalado el componente ‘Google USB Driver package’ en nuestro equipo. La mejor manera de hacerlo es a través de Android SDK Manager en la carpeta ‘Extras’. Nota: este driver es un controlador genérico para todos los móviles pero es posible que en algún dispositivo en concreto sea mejor utilizar el driver específico del modelo del fabricante.

Una vez instalado el componente debemos preparar nuestro terminal en modo depuración USB. La ubicación de esta opción depende de nuestro teléfono/tablet. Suele encontrarse en Ajustes -> Aplicaciones -> Desarrollo o en Ajustes -> Sistema -> Opciones de desarrollo.

Ya podemos visualizar el dispositivo desde Eclipse, para ello iremos a la opción de menú Windows -> Show View -> Devices.

Para desplegar la aplicación en el terminal real definiremos el Target del proyecto como manual y lo ejecutaremos pulsando botón derecho sobre él y seleccionaremos Run as -> Android Application. Seleccionaremos nuestro terminal y esperaremos a que se instale. Algunas veces es necesario configurar el móvil para que permita aplicaciones con orígnenes desconocidos (aplicaciones no instaladas desde Google Market).

Desplegar aplicaciones en el emulador de dispositivos Android con Eclipse

La SDK de android dispone de un emulador de dispositivos Android virtuales. Dentro de esta herramienta existen terminales virtuales con distintas características tanto como de hardware como de software. Esto nos permite probar la compatibilidad de nuestras aplicaciones para todo tipo de terminales android.

Desde Eclipse podemos acceder al administrador de dispositivos virtuales de android pulsando Window > Android Virtual Device Manager. La ventana abierta nos mostrará la lista de los disposivos virtuales android que tengamos instalados en nuestra directorio sdk de android. En esta lista nos indicará que API utiliza cada uno así como la plataforma, CPU (procesador que incorpora cada dispositivo), etc…

Si en esta lista no tenemos ninguno o queremos añadir uno nuevo pulsaremos sobre el botón New. Los campos a rellenar serán:

  • AVD Name: nombre que usaremos para identificar el dispositivo.
  • Device: permite seleccionar un terminal que se usará únicamente como interfaz.
  • Target: API/versión de Android que usará el terminal.
  • CPU/ABI: generalmente asociado a la target seleccionada anteriormente.
  • Keyboard: si está activado se mostrará un teclado para escribir.
  • Skin: activada permite enseñar una skin con controles de hardware.
  • Front Camera / Back Camera: si el desplegable está activado podremos seleccionar como funcionará la cámara. Tiene tres opciones:
    • None: no se utilizará la cámara
    • Emulated: cámara simulada.
    • Web Cam: si nuestro equipo dispone de webcam.
  • Memory Options: estableceremos las opciones de RAM y capacidad de la máquina virtual.
  • Internal Storage: capacidad de la memoria interna del terminal.
  • SD Card: capacidad de la tarjeta de memoria.
  • Emulation Options:
    • Snapshot: permite guardar el estado del dispositivo antes de cerrarlo. Es muy recomendable activarlo ya que mejora el rendimiento de trabajo sobre el emulador.

Para el despliegue de nuestro programa en un emulador lo que debermos hacer es pulsar con el botón derecho en la raíz del proyecto y seleccionar del menú la opción Run as > Run Configurations. En la ventana abierta aparecerán varias pestañas, seleccionamos la primera ‘Android’ y seleccionamos si no lo está nuestro proyecto con el botón de exploración. Posteriormente pasamos a la pestaña Target donde podremos seleccionar el dispositivo que se arrancará. También podemos hacer que nos pregunte con que configuración queremos simular (Always prompt to pick device) o dejar que automáticamente inicie el dispositivo con el recomendado para nuestra proyecto.

La SDK de android dispone de un emulador de dispositivos virtuales. Dentro de esta herramienta existen terminales virtuales con distintas características tanto como de hardware como de software. Esto nos permite probar la compatibilidad de nuestras aplicaciones para todo tipo de terminales android.

Desde Eclipse podemos acceder al administrador de dispositivos virtuales de android pulsando Window > Android Virtual Device Manager. La ventana abierta nos mostrará la lista de los disposivos virtuales android que tengamos instalados en nuestra directorio sdk de android. En esta lista nos indicará que API utiliza cada uno así como la plataforma, CPU (procesador que incorpora cada dispositivo), etc…

Si en esta lista no tenemos ninguno o queremos añadir uno nuevo pulsaremos sobre el botón New. Los campos a rellenar serán:

  • AVD Name: nombre que usaremos para identificar el dispositivo.
  • Device: permite seleccionar un terminal que se usará únicamente como interfaz.
  • Target: API/versión de Android que usará el terminal.
  • CPU/ABI: generalmente asociado a la target seleccionada anteriormente.
  • Keyboard: si está activado se mostrará un teclado para escribir.
  • Skin: activada permite enseñar una skin con controles de hardware.
  • Front Camera / Back Camera: si el desplegable está activado podremos seleccionar como funcionará la cámara. Tiene tres opciones:
    • None: no se utilizará la cámara
    • Emulated: cámara simulada.
    • Web Cam: si nuestro equipo dispone de webcam.
  • Memory Options: estableceremos las opciones de RAM y capacidad de la máquina virtual.
  • Internal Storage: capacidad de la memoria interna del terminal.
  • SD Card: capacidad de la tarjeta de memoria.
  • Emulation Options:
    • Snapshot: permite guardar el estado del dispositivo antes de cerrarlo. Es muy recomendable activarlo ya que mejora el rendimiento de trabajo sobre el emulador.

Para el despliegue de nuestro programa en un emulador lo que debermos hacer es pulsar con el botón derecho en la raíz del proyecto y seleccionar del menú la opción Run as > Run Configurations. En la ventana abierta aparecerán varias pestañas, seleccionamos la primera ‘Android’ y seleccionamos si no lo está nuestro proyecto con el botón de exploración. Posteriormente pasamos a la pestaña Target donde podremos seleccionar el dispositivo que se arrancará. También podemos hacer que nos pregunte con que configuración queremos simular (Always prompt to pick device) o dejar que automáticamente inicie el dispositivo con el recomendado para nuestra proyecto.

Cambiar el tamaño máximo para subir ficheros en php

Existe un tamaño máximo para subir ficheros en php. Este viene establecido en el fichero de configuración php.ini dentro de nuestro servidor.

Para aumentar o disminuir dicho valor deberemos editar este fichero de configuración e ir al valor upload_max_filesize.


upload_max_filesize=6M

En el ejemplo anterior el tamaño máximo es de 6 Megas, bastaría con cambiar este valor al  tamaño deseado. Eso sí es necesario reiniciar Apache para que los cambios surtan efecto.

En muchos cms como WordPress, Joomla, Prestashop o Drupal se da mucho un error al intentar subir plantillas, plugins, módulos… en muchas ocasiones esto está relacionado con el tamaño máximo permitido para subir un fichero. Este error se soluciona cambiando los valores de configuración de php.ini como anteriormente hemos descrito.

Mover WordPress a otro dominio

Si tienes que mover WordPress a otro dominio supone mucho más que mover los ficheros y la base de datos, desde luego esto último es imprescindible, pero hay que tomar acciones adicionales para borrar/modificar antiguas referencias al antiguo nombre de dominio o localización que se haya mantenido dentro de la base de datos.

Según la ayuda de WordPress tenemos dos opciones:

  • Realizar una búsqueda y reemplazo únicamente en la tabla wp_posts.
  • Usar una herramienta que realiza cambios en la base de datos de una manera segura. La herramienta en cuestión es: Database Search And Replace Script in PHP

Yo he podido probar la segunda opción y te diría que es la mejor porque dudo que en todos los casos valga únicamente con reemplazar en la tabla wp_posts.