Showing posts with label Android. Show all posts
Showing posts with label Android. Show all posts

Wednesday, January 29, 2014

Android: Ajustar pantalla cuando aparece el teclado

Android permite ajustar la pantalla cuando se aparece el teclado, existen dos opciones que se pueden resumir en una sola linea:

android:windowSoftInputMode="stateUnchanged|adjustResize"

Esta línea se debe usar en el Manifest.xml dentro de los tags de la actividad donde se desee aplicar. Dependiendo del resultado que se quiera obtener se puede jugar con las opciones.  Además de estas opciones mencionadas existen otras para lograr otros efectos.

Bookmark and Share

Monday, June 3, 2013

Validar el formato de un E-mail en Android

Se puede hacer con el siguiente método:

public static boolean isEmailValid(String email) {
    boolean isValid = false;

    String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
    CharSequence inputStr = email;

    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}

Gracias a la expresión regular indicada arriba, el método devolverá true si el formato es válido y false en caso contrario.

fuente

Bookmark and Share

Thursday, May 30, 2013

Android: Mostrar un mensaje cuando el ListView está vacío

Si se está usando el ListView, existe un método que se llama setEmptyView el cual recibe un view y se muestra cuando la lista está vacía. Aquí un ejemplo:

Primero se debe agregar un View (como un botón o un texto) al Layout de la actividad donde tienen el ListView. Aquí un ejemplo con un texto:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/myListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
    <TextView
        android:id="@+id/emptyListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"
        android:text="@string/emptyList" >
    </TextView>

</LinearLayout>
Es importante que tenga el atributo android:visibility="gone" para que no se muestre cuando la lista si tenga contenido.

Luego en la clase donde utlizan el ListView, deberán llamar al método setEmptyView y entregarle el TextView que creamos en el xml

ListView lv = getListView();
lv.setEmptyView(findViewById(R.id.emptyListView));
o bien

ListView lv = (ListView)findViewById(R.id.myListView);
lv.setEmptyView(findViewById(R.id.emptyListView));


Bookmark and Share

Tuesday, May 21, 2013

Configura la tipografía de tu aplicación Android

Android permite configurar la tipografía a gusto del desarrollador. Hay que tener en cuenta que existen tipografías que son pesadas y también algunas que requieren una licencia o permiso para poder utilizarlas.

Primero, parte con crear una carpeta llamada Fonts bajo la Carpeta res.
Agrega la tipografía que deseas usar a esa carpeta, este puede ser .otf o .ttf (puede que existan otros formatos que se puedan utilizar).

Lamentablemente, Android ya no permite configurar la tipografía a través del xml y se debe hacer en tiempo de ejecución y en cada uno de los elementos.

Por ejemplo, para un TextView. Primero, ubica el TextView que deseas configurar:


TextView tv = (TextView) findViewById(R.id.miTV);


Luego configura la tipografía:


Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/algunatipografia.ttf");


Configura la tipografía del TextView:


tv.setTypeface(tf);


Bookmark and Share

Thursday, May 9, 2013

Reiniciar posición de ScrollView en Android

ScrollView incorpora 2 funciones para reinicar la posición en la que se encuentra un ScrollView.

fullscroll(int direction)  recibe un entero que indica la dirección hacia donde realizar el un scroll completo.

scrollTo(int x, int y) recibe la posición x e y a donde se desea mover el scroller.

Por ejemplo si se desea mover hasta el inicio:

ScrollView sv = (ScrollView) findViewById(R.id.tu_scrollview);
sv.scrollTo(0,0);


Bookmark and Share

Friday, November 9, 2012

"Google Play no acepta archivos APK firmados con el certificado de depuración. Crea un certificado nuevo que sea válido durante al menos 50 años."

He tratado de subir mi primera aplicación de android al market Google Play y me apareció el siguiente error:

"Google Play no acepta archivos APK firmados con el certificado de depuración. Crea un certificado nuevo que sea válido durante al menos 50 años."

Qué es lo que ocurre? El APK debe ser firmado para que no se pueda modificar a menos que se tenga la llave privada con la que se generó la firma. Sin esta firma, los dispositivos Android no querrán instalar una aplicación.
En un principio, cuando se está desarrollando, la aplicación se firma con una llave de debug, que sirve para poder depurarlo y probar la aplicación en tu dispositivo mientras haces pruebas. Para publicarlo en el market, esta firma debe cambiar ya que la firma de debug no es aceptada.

Si utilizan Basic4Android, hay una forma muy sencilla para solucionar este problema. Solo sigan este tutorial.
Pero no es mi caso, yo uso Eclipse. En el sitio de android developers se puede encontrar información al respecto. Aquí lo hay que hacer según android developers:



  • Obtain a suitable private key
  • Compile the application in release mode
  • Sign your application with your private key
  • Align the final APK package


  • Si están haciendo una aplicación nativa pueden utilizar el wizard de exportar de Eclipse el cual realiza todos estos pasos.

    Yo estoy trabajando en una aplicación multi-plataforma utilizando Rhomobile por lo que requiere seguir los pasos descritos, pero es muy fácil:

    Generar una clave privada, se debe usar un keytool. En Windows abrir consola y utilizar el siguiente comando:


    $ keytool -genkey -v -keystore nombre-de-mi-llave.keystore
    -alias nombre_alias -keyalg RSA -keysize 2048 -validity 10000

    Donde deben reemplazar "nombre-de-mi-llave" y "nombre_alias" por el que gusten. Cuando corran ese comando se les pedirá ciertos datos, incluida una clave la cual deben guardar muy bien ya que si alguien tiene acceso a ella y a la llave pueden manipular su aplicación.
    Si quieren más detalles sobre el comando lean aquí

    Una vez generada la llave. Abran su proyecto y vayan al build.yml y bajo android agreguen lo siguiente bajo production, de tal manera que se vea así:


    android:
      android_title: 0
      version: 2.3.3
      emulator: rhomobile
      production:
        certificate: E:/nombre-de-mi-llave
        password: "clave_de_la_llave"
        alias: "nombre_alias"


    ahora abran la consola de nuevo, vayan a la carpeta de su proyecto y corran el comando:

    rake device:android:production

    de manera que compile nuevamente el proyecto, pero esta vez utilizando la llave indicada para firmar el apk. Cuando corran esto se les pedirá que completen nuevamente los campos que fueron solicitados cuando generaron la llave. Terminado de correr el comando podrán navegar a la carpeta de su aplicación/bin/target y encontrarán el APK firmado y listo para ser subido a Google Play :)

    Bookmark and Share

    Wednesday, September 12, 2012

    Sliding Drawer en Android

    Sliding Drawer o cajón deslizable (?)

    Lo que hace el Sliding Drawer es esconder contenido de un usuario dejando sólo una lengüeta visible, así el usuario puede deslizar la lengüeta para ver el contenido.

    Como bien dice en http://developer.android.com este "cajón" se puede utilizar de manera vertical u horizontal. El xml está compuesto por dos hijos, uno referente al la lengüeta y otro al contenido de éste.

    La plantilla que http://developer.android.com utiliza un imageView para la lengüeta, yo utilicé en este caso un botón, de manera de no tener que lidiar con imagenes. Pero lo pueden cambiar a un imageView si desean. A su vez, cambié el tipo del contenido de GridView a un simple TextView para agregar texto.

    Primero, necesitan uno (o dos) templates para el fondo de la lengüeta y del contenido del cajón. En este caso yo use una plantilla de un fondo azul el cual debe colocarse en la carpeta drawable en un archivo llamado blue.xml por ejemplo.

    El contenido de éste archivo es el siguiente:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" >
            <shape>
                <solid
                    android:color="#449def" />
                <stroke
                    android:width="1dp"
                    android:color="#2f6699" />
                <corners
                    android:radius="3dp" />
                <padding
                    android:left="10dp"
                    android:top="10dp"
                    android:right="10dp"
                    android:bottom="10dp" />
            </shape>
        </item>
        <item>
            <shape>
                <gradient
                    android:startColor="#449def"
                    android:endColor="#2f6699"
                    android:angle="270" />
                <stroke
                    android:width="1dp"
                    android:color="#2f6699" />
                <corners
                    android:radius="4dp" />
                <padding
                    android:left="10dp"
                    android:top="10dp"
                    android:right="10dp"
                    android:bottom="10dp" />
            </shape>
        </item>
    </selector>
    La lengüeta es lo que tiene el texto "ayuda". Los otros botones que ven son del  proyecto en el que estoy trabajando, no tienen nada que ver con el sliding drawer

    Luego el xml del sliding drawer lo deben colocar dentro de un relativeLayout (o un FrameLayout) (en el xml del layout donde quieren que se vea)

    Así quedó mi sliding drawer:

     <SlidingDrawer
         android:id="@+id/drawer"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:handle="@+id/handle"
         android:content="@+id/content">
         <Button
             android:id="@id/handle"
             android:layout_width="88dip"
             android:layout_height="44dip"
             android:background="@drawable/blue"
             android:text="ayuda"
             android:textColor="#ffffff"/>
    
         <TextView
             android:id="@id/content"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:background="@drawable/blue"
             android:textColor="#ffffff"
             android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut condimentum commodo purus sit amet cursus. Pellentesque euismod nulla et mauris porttitor sit amet consectetur quam euismod. Proin augue ligula, commodo sit amet pellentesque at, bibendum in augue. Vestibulum a metus sit amet lacus porta molestie. Curabitur porta laoreet ipsum quis tincidunt. Nulla facilisi. Quisque dictum mollis ante id blandit. Nam in elit sit amet eros varius posuere id id dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis et nibh pretium nisl semper porta elementum sed justo. Sed et enim arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ac nunc eu est adipiscing condimentum id nec nisl. Proin massa erat, ultrices at ullamcorper in, consectetur nec tortor. Sed sed erat ante. Morbi eu nunc mauris." />
         </SlidingDrawer>
    
    

    Bookmark and Share

    Friday, September 7, 2012

    Verificar que una URL es de una imagen en Java/Android

    Si es necesario verificar que una URL es una enlace a una image, bastan 3 líneas de código para hacerlo:


    URLConnection connection = new URL("http://foo.bar/w23afv").openConnection();
    String contentType = connection.getHeaderField("Content-Type");
    boolean image = contentType.startsWith("image/");


    Lo que hace es ver si el encabezado del contenido de la página donde te lleva la url comienza con image/.

    Solución sacada de stackoverflow

    Bookmark and Share

    Tuesday, August 21, 2012

    Eliminar nombre de aplicación en barra de estado en Android

    Por defecto, las aplicaciones en android muestran una barra de estado con el nombre de la aplicación. Esto muchas veces se ve feo y se puede sacar de dos formas: De forma dinámica en una actividad y en el manifesto.

    Aquí la segunda forma, más rapida y requiere menos código:


    <activity android:name=".ActivityName"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
    </activity>

    Así se configura el estilo de la aplicación, se le saca la barra y se coloca en pantalla entera.


    Bookmark and Share

    Sunday, August 19, 2012

    Patrón de fondo en aplicaciones Android

    Buscando cómo colocar un patrón de fondo en una aplicación Android, me encontré con un excelente tutorial de Matt Swanson.

    Aquí lo que aparecía en el tutorial:


    1. Tener un imagen que pueda ser utilizada de patrón. Ésta se puede obtener del sitio Subtle Patterns donde hay decenas de patrones que se pueden elegir.
    2. Colocar el archivo nombrepatronescogido.png en la carpeta drawable.
    3. Crear el fondo con el patrón: Para esto creen un archivo xml en la carpeta drawable, llámenlo patron_de_fondo.xml por ejemplo. Dentro de este archivo colocar el siguiente código:
    4. <?xml version="1.0" encoding="utf-8"?>
      <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
          android:src="@drawable/patron_de_fondo"
          android:tileMode="repeat" />
    5. Agregar el fondo a alguna vista. Para ello deben agregar la linea android:background="@drawable/patron_de_fondo" a un layout, ejemplo:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/background_repeating"
        android:orientation="vertical" >
    </LinearLayout>

    Y listo, la aplicación ya tiene un lindo fondo.

    Bookmark and Share

    Sunday, April 15, 2012

    Rellenando un spinner manualmente (Android)

    Hay distintas formas para llenar un spinner en Android. En la página de desarrolladores de Android, hay un tutorial para llenar un spinner a través de una lista estática creada en la carpeta de recursos, pero qué pasa si uno la quiere llenar de forma dinámica, donde los valores que se incluyan dependen de cierto parámetro?
    Para este problema encontré un tutorial muy bueno, fácil y rápido para solucionar este problema.

    Primero, debemos crear un adpatador del tipo CharSequence donde agregaremos los items que queremos. Para eso tenemos las siguientes lineas de código:

     ArrayAdapter <CharSequence> adapter =
      new ArrayAdapter <CharSequence> (this, android.R.layout.simple_spinner_item );
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    

    No deben cambiar nada de lo de arriba.
    Luego deben agregar los itemes a mostrar de la forma

    adapter.add("item 1");

    Luego asignamos estos datos al spinner que queremos:


    Spinner s = (Spinner) findViewById(R.id.mi_spinner);
    
            		s.setAdapter(adapter);


    y listo!

    Bookmark and Share

    Friday, April 6, 2012

    Diálogo de selección multiple

    Encontré un excelente tutorial para crear diálogos de multiselección en Android, lo comparto con ustedes aquí un poco modificado y con algunos comentarios y sugerencias para que no tengan los mismos problemas que yo:


    Primero, deben decidir desde donde quieren mostrar este diálogo, es decir qué quieren que gatille el diálogo. Puede ser un botón cualquiera, un botón  en el menú de opciones o puedes querer que se gatille cada vez que se inicie una nueva actividad (un Intent nuevo).

    Independiente de cómo quieran que se gatille, deben realizar la misma llamada en los correspondientes métodos donde se gatillan las actividades de cada una de las cosas de arriba. Es decir, para el caso del botón colocarlo en el OnClick(...), en el caso del menú de opciones en el onOptionsItemSelected(...) y en el caso de una actividad, en el onCreate(...). Lo que deben colocar es:

    showDialog( 0 );

    Antes de crear el diálogo. Debemos crear un arreglo de las opciones a mostrar en el diálogo como atributos de la clase, de esta manera:

    public CharSequence[] dialogOptions = {"opción 1", "opción 2", "opción 3"};
    y también crear un arreglo de booleanos donde se guardará la información sobre las opciones seleccionadas. Este segundo arreglo debe tener el mismo largo:

    public boolean[] dialogSelections =  new boolean[ dialogOptions.length ];
    Luego se deben crear 3 métodos, en la misma clase donde se llama a showDialogo(0);
    El primero crea el diálogo:


    @Override
    
     protected Dialog onCreateDialog( int id ) {
    
      return new AlertDialog.Builder( this )
              .setTitle( "Título del diálogo")
                    .setMultiChoiceItems( dialogOptions, dialogSelections, new DialogSelectionClickHandler() )
                    .setPositiveButton( "OK", new DialogButtonClickHandler() )
                    .create();
     }
    
    
    
    
    en el setMultiChoiceItems, se le entregan las opciones a desplegar, el arreglo donde guardar la selección y un Handler que puede realizar algo cada vez que se seleccionar una opción. Este último es algo así:


    public class DialogSelectionClickHandler implements OnMultiChoiceClickListener {
    
      @Override
    
      public void onClick(DialogInterface arg0, int arg1, boolean arg2{
        //no hace nada por ahora
       //si se saca la selección no funciona
      }
     }
    
    
    Si no necesitan hacer nada, le recomiendo que lo coloquen igual. Al menos a mi no me guardaba la selección a menos que tuviera el método creado.

    Por último, el método que realiza la acción una vez que se hace click en el botón "aceptar" u "ok", como le hayan llamado. Este es el método:


    public class DialogButtonClickHandler implements DialogInterface.OnClickListene {
    
      public void onClick( DialogInterface dialog, int clicked ) {
    
       switch( clicked ) {
        case DialogInterface.BUTTON_POSITIVE:
         //realizan sus acciones acá.
    
         break;
       }
      }
     }
    
    Eso es todo.


    Bookmark and Share

    Tuesday, January 31, 2012

    Un HelloWorld de GoogleMaps en Android [Tutorial]

    Asumiendo que ya tienen un proyecto creado, deben seguir las siguientes instrucciones para hacer funcionar GoogleMaps en su applicación Android:

    1. Antes que todo, deben saber que para hacer funcionar los mapas, deben conseguir una API key, una clave, gratuita proporcionada por Google. Ésta es única para cada computador, por lo que si trabajan colaborativamente, no podrán usar una sola clave para el proyecto, cada uno debe tener la suya.

    Las instrucciones las pueden obtener aquí http://code.google.com/intl/es/android/add-ons/google-apis/mapkey.html  (en inglés) Si necesitan ayuda con eso, escriban en los comentarios.


    Ahora que tienen la apikey, seguimos con nuestr aplicación:

    2.  Creen una nueva vista (donde mostrarán el mapa). Vayan a la carpeta res/layout y creen un archivo nuevo, llámenlo mapview.xml .
    3.  Creen una nueva clase, llámenla GoogleMapActivity (aparecerá como GoogleMapActivity.java)
    4. El GoogleMap debe extender de MapActivity para poder hacer funcionar el mapa. El código base que deben tener en esa clase es:

    package el.nombre.de.su.paquete;
    
    import android.os.Bundle;
    import com.google.android.maps.MapActivity;
    
    public class GoogleMapActivity extends MapActivity {
    
        /*Se llama cuando la actividad se crea inicialmente*/
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
    
          /*Configuramos el contenido para que se muestre en la vista que creamos en el paso 2.*/
            setContentView(R.layout.mapview);
        }
    
        @Override
        protected boolean isRouteDisplayed() {
            return false;
        }
    }

    5. En el manifest se deben agregar algunas líneas de código:

    <uses-permission android:name="android.permission.INTERNET"/>
    
    esto debe ir dentro de los tags:
     <manifest> </manifest>

    y dentro de los tags 
    <aplication> </aplication>
    deben agregar:

    <uses-library android:name="com.google.android.maps"></uses-library>

    6. Y con eso ya estamos listos. Ahora para llamar al mapa con un boton, hay que agregar el botón al main.xml de res/layout, llamar a la actividad desde la actividad principal con el siguiente código por ejemplo:


    Button btn_map = (Button) findViewById(R.id.button2);
    btn_map.setOnClickListener(new OnClickListener() {
    
    @Override
    public void onClick(View v) {
     Intent myIntent = new Intent(this, GoogleMapActivity.class);
         startActivity(myIntent);
     }
    });

    y agregar la actividad al manifiesto:
         
     <activity android:name=".GoogleMapActivity"></activity>

    OJO: Recuerden que en las propiedades del proyecto el target debe estar configurado para un Google APIs



    Este tutorial fue posible gracias a este link (en inglés).

    Bookmark and Share

    Wednesday, October 26, 2011

    missing org.eclipse.wst.sse.core 0.0.0

    Es posible que al instalar el ADT de Android en Eclipse, les aparezca el error donde indica que falta el componente org.eclipse.wst.sse.core 0.0.0

    De este link encontré los siguientes pasos a seguir para solucionar el problema, (se los dejo en inglés):


    Eclipse 3.6 (Helios)

    1. Select Help > Install New Software...
    2. Click the link for Available Software Sites.
    3. Ensure there is an update site named Helios. If this is not present, click Add... and enterhttp://download.eclipse.org/releases/helios for the Location.



    Una vez realizado esto, vayan a Help > Install New Software... y vuelvan a intentar con el ADT, fíjense que deben tener marcada la casilla "Contact all update sites during the install to find required software"

    Bookmark and Share

    Saturday, September 3, 2011

    [Rhomobile Rhodes] error: device not found

    Si les sale el mensaje "error: device not found" cuando tratan de correr su aplicación en el emulador, es muy posible que no hayan instalado el SDK de Android en la carpeta adecuada. Por ejemplo si la tienen en
    C:\Archivos de Programa\Android\android-sdk

    Muevan la carpeta de Android/android-sdk de manera que la ruta les quede así:

    C:\Android\android-sdk

    Luego corran en la consola:

    $ rhodes-setup

    Y configuren la nueva ruta del sdk.

    Ahora el problema debiese estar solucionado. Esto se debe a que se produce en error por los espacios que contiene el nombre de las carpetas que venían antes de Android.
    Si usan el SDK de Android con Eclipse también tendrán que hacer un arreglito para que les corra el emulador.

    Bookmark and Share

    Thursday, September 1, 2011

    Rhodes: "Error wrong android API version:"

    Si al tratar de correr tu aplicación con Rhodes te tira el error "Error wrong android API version:" revisa los Android API's que tienes instalado desde el Android SDK and AVD Manager

    Rhodes sólo soporta hasta el SDK 3.0, por lo que si cuentas con las API's 12 y/o superiores instaladas debes eliminarlas para poder correr tu aplicación.

    Para eliminar basta seleccionarlas de la lista y luego hacer clic en el botón delete
    O bien se puede ir a la carpeta del Android SDK, luego a la carpeta Platforms y eliminar las API's que "nos sobran".

    Con eso se soluciona el problema.

    Bookmark and Share

    Sunday, January 30, 2011

    Constante bloqueo de pantalla de Android Nexus One

    El Android Nexus One es un excelente teléfono, pero constantemente se apagaba la pantalla y no podía encenderlo nuevamente hasta que removía la batería, la colocaba de nuevo y presionaba el botón encender para que inciara desde cero. Lo que aparentaba que el teléfono se estaba congelando.

    La búsqueda que realicé en internet me llevó a una posible y muy obvia solución: una aplicación es la que está causando el problema. Específicamente la que más puede causar un problema es un Task Killer, una aplicación que permite terminar otras aplicaciones. Por lo que formatié mi celular y específicamente desinstalé el Task Killer, pero el problema seguía ocurriendo.

    Lo que sí solucionó el problema es algo que no encontré en ningún foro y por eso lo comparto aquí: la tarjeta microSD.
    Resultó que la tarjeta microSD que estaba usando no era de muy buena calidad, la cambié por una SanDisk y el problema desapareció. Así de fácil. Espero esto le sirva a alguien.

    SanDisk 16 GB microSDHC Flash Memory Card SDSDQ-016G (Bulk Packaging)

    Bookmark and Share
    Related Posts Plugin for WordPress, Blogger...