Nueva versión 1.2 de AEMET (no oficial)


Se ha publicado una nueva versión de la aplicación AEMET (no oficial). Los cambios son los siguientes:
  • Añadido el soporte para consultar las imágenes de satélite
  • Se ha cambiado el parseador por TagSoup
  • Se ha mejorado el sistema de gestión de tareas en segundo plano
  • Se han corregido algunos fallos
Más información

    Web Service con Maven + Axis2 + Spring framework - Parte II (Seguridad)


    Ya vimos en la Parte I de este tutorial cómo crear un servicio web con Maven, Axis2 y Spring. En esta segunda parte veremos cómo agregarle seguridad mediante usuario y password.

    Web Service con Maven + Axis2 + Spring framework

    En este post voy a explicar cómo crear un servicio web con Maven, Axis2 y Spring framework. La idea es tener el mínimo número de ficheros y configuración para que el servicio web funcione.

    Google Calendar en el escritorio de Ubuntu

    En este post voy a explicar algo que debería ser fácil de conseguir pero que hasta hace poco no había conseguido de una forma tan limpia. Hasta ahora venía usando un calendario para el escritorio llamado Rainlendar. Este escritorio se integra bastante bien en el escritorio de Ubuntu y mediante un programita llamado GCalDaemon se conseguía sincronizar el calendario con Google Calendar. El procedimiento está explicado en un post de no hace mucho:
    Pero hoy mismo, leyendo una entrada de Ubuntips se me ha ocurrido cómo integrar de una forma más limpia (ejecutando únicamente un programa y dejando que la sincronización la haga el propio Google)

    Wallpapers para Android - Dream Theater

    ¿Tienes un móvil con Android?, ¿te gustan los Dream Theater?. Entonces te interesará este post en el que os voy a proponer un cambio de look para vuestro móvil.

    Existen multitud de páginas y aplicaciones que nos proporcionan cambiar fácilmente nuestro fondo de pantalla. ElAndroideLibre.com ya habló de esto en un post.

    Yo os voy a proponer varios fondos de pantalla que he preparado para Android, algunos de ellos extraídos a partir de las imágenes de SteveTheater. Los fondos de pantalla vienen con la resolución adecuada (640x480):














    Espero que os gusten

    Mensajes emergentes en Android - Parte 1

    En este post veremos el primero y más simple de los mensajes emergentes en Android. La plataforma Android nos proporciona mecanismos para crear de forma simple efectos muy integrados con la apariencia general del sistema.

    Los mensajes que vamos a crear se denominan Toast y vamos a ver mensajes Toast de cuatro tipos:
    Mensaje de sólo texto Mensaje con icono
    Mensaje con icono y texto Mensaje con icono y texto con XML

    Veamos cómo se crearía cada uno de ellos. Cabe destacar que este código debe ejecutarse dentro del código de una clase Activity.


    Mensaje de sólo texto

    Toast toast = Toast.makeText(getApplicationContext(), "Mensaje Toast con sólo texto", Toast.LENGTH_SHORT);
    toast.show();
    


    Mensaje con icono

    Toast toast = new Toast(getApplicationContext());
    ImageView view = new ImageView(getApplicationContext());
    view.setImageResource(android.R.drawable.ic_menu_info_details);
    toast.setView(view);
    toast.setDuration(Toast.LENGTH_SHORT);
    toast.show();
    


    Mensaje con icono y texto

    Toast toast = Toast.makeText(getApplicationContext(), "Mensaje Toast con texto e icono", Toast.LENGTH_SHORT);
    View textView = toast.getView();
    LinearLayout lay = new LinearLayout(getApplicationContext());
    lay.setOrientation(LinearLayout.HORIZONTAL);
    ImageView view = new ImageView(getApplicationContext());
    view.setImageResource(android.R.drawable.ic_menu_info_details);
    lay.addView(view);
    lay.addView(textView);
    toast.setView(lay);
    toast.show();


    Mensaje con icono y texto con XML

    LayoutInflater inflater = getLayoutInflater();
    View layoutView = inflater.inflate(layout, null);        
    Toast toast = new Toast(getApplicationContext());
    toast.setDuration(Toast.LENGTH_SHORT);
    toast.setView(layoutView);
    toast.show();
    

    El código XML del Toast sería:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@layout/border"
        android:gravity="center">
            <ImageView 
                  android:src="@android:drawable/ic_menu_info_details"
                  android:layout_width="wrap_content"
                  android:layout_height="fill_parent"
                  android:layout_marginRight="10dp"/>
     <TextView 
                 android:text="@string/text_icon_msg"
                 android:layout_width="wrap_content"
                 android:layout_height="fill_parent"
                 android:textColor="#FFFFFF"
                 android:gravity="center_vertical"/>
    </LinearLayout>
    
    Como puede verse, la propiedad android:background del elemento LinearLayout apunta a un layout llamado border. Este es una forma de hacer que la ventana tenga los bordes redondeados. Debemos crear un fichero XML llamado border.xml dentro de la carpeta res/layout con el siguiente contenido:
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="#444444"/>    
        <stroke 
            android:width="4dp" 
            android:color="#999999" />
        <padding 
            android:left="7dp" 
            android:top="7dp"
            android:right="7dp" 
            android:bottom="7dp" />
        <corners 
            android:bottomRightRadius="7dp" 
            android:bottomLeftRadius="7dp" 
            android:topLeftRadius="7dp" 
            android:topRightRadius="7dp"/> 
    </shape> 
    

    Ahora veamos el código de la clase activity al completo:
    package org.ffbeltran;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.Toast;
    
    public class EjemploToast extends Activity {
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            Button button;
            button = (Button) findViewById(R.id.text_only_button);
            button.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {
                    textOnlyToast(getString(R.string.text_only_msg), Toast.LENGTH_SHORT);
                }
            });
            
            button = (Button) findViewById(R.id.icon_only_button);
            button.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {
                    iconOnlyToast(android.R.drawable.ic_menu_info_details, Toast.LENGTH_SHORT);
                }
            });
            
            button = (Button) findViewById(R.id.text_icon_button);
            button.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {
                    textIconToast(R.layout.text_icon_toast, Toast.LENGTH_LONG);
    //                textIconToast(getString(R.string.text_icon_msg), 
    //                        android.R.drawable.ic_menu_info_details, Toast.LENGTH_SHORT);
                }
            });
        }
        
        private void textOnlyToast(String message, int duration) {
            Toast toast = Toast.makeText(getApplicationContext(), message, duration);
            toast.show();
        }
        
        private void iconOnlyToast(int icon, int duration) {
            Toast toast = new Toast(getApplicationContext());
            ImageView view = new ImageView(getApplicationContext());
            view.setImageResource(icon);
            toast.setView(view);
            toast.setDuration(duration);
            toast.show();
        }
        
        private void textIconToast(String message, int icon, int duration) {
            Toast toast = Toast.makeText(getApplicationContext(), message, duration);
            View textView = toast.getView();
            LinearLayout lay = new LinearLayout(getApplicationContext());
            lay.setOrientation(LinearLayout.HORIZONTAL);
            ImageView view = new ImageView(getApplicationContext());
            view.setImageResource(icon);
            lay.addView(view);
            lay.addView(textView);
            toast.setView(lay);
            toast.show();
        }
        
        private void textIconToast(int layout, int duration) {
            LayoutInflater inflater = getLayoutInflater();
            View layoutView = inflater.inflate(layout, null);        
            Toast toast = new Toast(getApplicationContext());
            toast.setDuration(duration);
            toast.setView(layoutView);
            toast.show();
        }
    }
    
    Éste es el código del layout principal:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_horizontal">
     <TextView  
         android:gravity="center"
      android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:text="@string/app_name"
         android:textSize="25sp"
         android:textStyle="bold"
            android:layout_marginTop="25dip"
         android:layout_marginBottom="25dip"/>
     <Button
         android:id="@id/text_only_button"
         android:layout_gravity="center"
         android:layout_width="200dip"
         android:layout_height="wrap_content"
         android:text="@string/text_only_button"/>
       <Button
         android:id="@id/icon_only_button"
         android:layout_gravity="center"
         android:layout_width="200dip"
         android:layout_height="wrap_content"
         android:text="@string/icon_only_button"/>
     <Button
         android:id="@id/text_icon_button"
         android:layout_gravity="center"
         android:layout_width="200dip"
         android:layout_height="wrap_content"
         android:text="@string/text_icon_button"/>
    </LinearLayout>
    
    Y éste el código de res/values/strings.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="app_name">EjemploToast</string>
        
        <string name="text_only_button">Sólo texto</string>
        <string name="icon_only_button">Sólo icono</string>
        <string name="text_icon_button">Texto e icono</string>
        
        <string name="text_only_msg">Mensaje Toast con sólo texto</string>
        <string name="text_icon_msg">Mensaje Toast con texto e icono</string>
    </resources>
    
    Por último, puedes cargar el código fuente aquí:

    Presentación de Subversion

    A continuación podéis ver la presentación de Subversion + TortoiseSVN que realicé esta semana. espero que os se a de utilidad.

    Presentación de Subversion