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 28, 2013

Cambiar la zona horaria del servidor Heroku

Es muy fácil cambiar la zona horaria de Heroku:


  1. Deben obtener la zona horaria que quieren configurar de este link. Ahí deben escoger el texto bajo la columna "TZ"
  2. En su consola local, deben correr el comando: heroku config:add TZ=America/Santiago

Y listo, su servidor se reiniciará una vez finalizada la configuración.

Para revisar que el cambio se haya realizado de forma satisfactoria deben iniciar la consola de heroku desde su consola local (heroku run console) y luego escribir el comando Time.now  ahí se les imprimirá la hora.


Bookmark and Share

Tuesday, May 21, 2013

AFNetworking: Leer una respuesta XML en una aplicación para iPhone, con XCode

Con AFNetworking es muy fácil leer respuestas en XML o JSON que entregue un servidor.
Aquí un ejemplo con XML:

Primero deben bajar el AFNetworking a su computador desde el link:

https://github.com/AFNetworking/AFNetworking

Una vez descargada, descomprime la carpeta. Ahora contaras con una carpeta con un nombre similar (o igual) a: AFNetworking-AFNetworking-211cdfc

Ahora anda a XCode, selecciona tu proyecto, anda a Archivo y haz clic en la opción "Agregar archivo a <nombre_de_tu_proyecto>". Ahi busquen la carpeta AFNetworking-AFNetworking-211cdfc, ábranla y seleccionen la carpeta AFNetworking que está adentro.

Ya estás listo para empezar a conectarte con tu servidor.

Para empezar debes agregar los archivos al encabezado:

#import "AFXMLRequestOperation.h"
#import "AFHTTPClient.h"

Luego debes iniciar la comunicación con el servidor y obtener el XML.


        //Supongamos que deseamos enviar el mail y contraseña a nuestro servidor para obtener una respuesta cuando un usuario intenta iniciar sesión.
NSString *email = [self.txtUsername text];
        NSString *contrasena = [self.txtPassword text];
//Crea un NSDictonary con los parámetros
        NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                                email, @"email",
                                contrasena, @"contrasena",
                                nil];
        
//Indica la url de tu servidor
        NSURL *url = [[NSURL alloc] initWithString:@"http://www.miservidor.com"];
        AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
        [httpClient registerHTTPOperationClass:[AFXMLRequestOperation class]];
        [httpClient setDefaultHeader:@"Accept" value:@"application/xml"];
        //Indica donde se debe hacer la petición
NSMutableURLRequest *request1 = [httpClient requestWithMethod:@"POST" path:@"/iniciar_sesion" parameters:params];
        AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request1 success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
            
            XMLParser.delegate = self;

//Aquí leemos la respuesta del XML
            [XMLParser parse];
        } failure:nil];

//Aquí iniciamos la llamada
        [operation start];

Ahora falta crear las funciones para parsear el archivo XML, esto se puede lograr de diferentes maneras. Aquí muestro una:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
    self.currentElement = [elementName copy];
    self.ElementValue = [[NSMutableString alloc] init];
    
//Ejemplo de lectura
    if ([elementName isEqualToString:@"algun-campo"]) {    
       // hacer algo, ejemplo imprimir un mensaje...
    }
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    [self.ElementValue appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if([elementName isEqualToString:@"algun-campo"]){
    //hacer alguna acción, por ejemplo:
    NSLog(self.ElementValue);   
    }
}

Cualquier cosa dejen un comentario!



Bookmark and Share

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

Thursday, March 28, 2013

Actualizando a Rhodes 3.5.1

Un poco tarde vengo a escribir de esto, pero para aquellos que no saben, hace unos meses atrás salió la versión de Rhodes 3.5.1

Para actualizar la versión en Windows:

gem install rhodes (o gem update rhodes) 

rhodes-setup (o copiar rhobuild.yml desde la gema rhodes vieja) 
cd <a-tu-aplicación-de-rhodes> migrate-rhodes-app

Ahora el instalador RhoStudio para Windows y Mac son parte de RhoElements v2.x


Bookmark and Share

Tuesday, March 26, 2013

Error H10 al hacer deploy en Heroku

Segunda vez que hago el deploy de una aplicación en Heroku y me vuelve a salir el mismo problema:

at=error code=H10 desc="App crashed" method=GET path=/ host=nombre-de-mi-app.herokuapp.com fwd="190.21.126.160" dyno= connect= service= status=503 bytes=

at=error code=H10 desc="App crashed" method=GET path=/favicon.ico host=timepoints.herokuapp.com fwd="190.21.126.51" dyno= connect= service= status=503 bytes=

Intenté las siguientes cosas y mi problema se solucionó:

En stackoverflow sugerían lo siguiente:

heroku run rake db:migrate

pero eso no me solucionó el problema (inicialmente al menos), lo que había que fijarse bien es que el archivo database.yml esté bien configurado para el ambiente de producción.

En particular, lo que tuve que editar fue el nombre del usuario de la base de datos, lo dejé en root y me aseguré que el nombre de la base de datos esté toda en minúsculas y en el formato: nombreapp_production.

Ejemplo:


production:
  adapter: postgresql
  encoding: unicode
  database: nombreapp_production
  pool: 5
  username: root
  password:


y fijarse de cualquier otro error que pueda estar surgiendo de alguna clase que se está subiendo también puede solucionar el problema.


Bookmark and Share

Related Posts Plugin for WordPress, Blogger...