iPhone: Hide Keyboard when touching the screen

Muchas veces en las pantallas hay muchos textfields y necesitamos esconder el teclado para volver a ver toda la pantalla. Aunque puedes sobreescribir y personalizar el comportamiento del botón “intro” del teclado, la forma más sencilla para esconderlo es sobreescribir el siguiente método:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

iPhone: Els Amics de les Arts

Aunque hace tiempo que no ponemos nada, no quiere decir que estemos parados.

Hoy nos complace presentaros la aplicación para iPhone de Els Amics de les Arts (link)

Noticias, conciertos, muro donde poder estar en contacto con ellos, todos sus videos y videoclips, letras de las canciones…

Esperamos que os guste, bon profit!


link | App Els Amics de les Arts

web | Els Amics de les Arts

iPhone: Create Singleton instance

A continuación veremos como crear una clase singleton en objective-c.

Un singleton es una clase con una única instancia. Puede servirnos para guardar variables globales de la aplicación.

MySingletonInstance.h

#import <Foundation/Foundation.h>
@interface MySingletonInstance : NSObject{
}
@property (nonatomic,retain) NSString *myString;
@property (nonatomic,retain) NSMutableArray *myArray; 
+ (MySingletonInstance *) instance;
@end

MySingletonInstance.m

#import "MySharedSingleton.h"
@implementation MySharedSingleton
@synthesize myArray, myString;

static MySingletonInstance *sharedSingletonInstance = nil;

+ (FilterParams *) instance {
    @synchronized(self) {
        if(sharedSingletonInstance == nil) sharedSingletonInstance = [[self alloc] init];
    }
    return sharedSingletonInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if(sharedSingletonInstance == nil) {
            sharedSingletonInstance = [super allocWithZone:zone];
            return sharedSingletonInstance;
        }
    }
    return nil;
}

- (id) copyWithZone:(NSZone *)zone {
    return self;
}

- (id) retain {
    return self;
}

- (unsigned) retainCount {
    return UINT_MAX;
}

- (void) dealloc { 
    [super dealloc];
    [myArray release];
    [myString release];
}

- (id) autorelease {
    return self;
}

Como llamar al singleton desde otra clase

MySingletonInstance *msi = [MySingletonInstance instance];
msi.myArray = self.myOtherArray;
msi.myString = self.myOtherString;

Android: ScreenShot / ScreenCapture Code

Con estas líneas podemos hacer una captura de pantalla de nuestra aplicación Android. En este ejemplo la captura se guarda en la sdCard.

Del codigo, hay que tener en cuenta que se hace la captura de un View (viewToBeCaptured), que le tenemos que asignar el layout que queramos capturar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.ideaknow.proves;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
 
public class ScreenCaptureActivity extends Activity {
    private View viewToBeCaptured;
    private Button button;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        button = (Button) findViewById(R.id.button1);
 
        viewToBeCaptured = this.findViewById(R.id.mainView);
        viewToBeCaptured.setDrawingCacheEnabled(true);
        viewToBeCaptured.buildDrawingCache();
 
        button.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                Log.v("Saved", "Save screenshot?");
                saveFile();
            }
        });
    }
 
    public void saveFile(){
        Bitmap b = viewToBeCaptured.getDrawingCache();
        File sd = Environment.getExternalStorageDirectory();
        File f = new File(sd, "captureAndroid.png");
        try {
            if (sd.canWrite()) {
                Log.v("Saved", "Screenshot saved");
                f.createNewFile();
                OutputStream os = new FileOutputStream(f);
                b.compress(Bitmap.CompressFormat.PNG, 90, os);
                os.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        viewToBeCaptured.setDrawingCacheEnabled(false);
    }
}
package com.ideaknow.proves;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class ScreenCaptureActivity extends Activity {
	private View viewToBeCaptured;
	private Button button;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		button = (Button) findViewById(R.id.button1);

		viewToBeCaptured = this.findViewById(R.id.mainView);
		viewToBeCaptured.setDrawingCacheEnabled(true);
		viewToBeCaptured.buildDrawingCache();

		button.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				Log.v("Saved", "Save screenshot?");
				saveFile();
			}
		});
	}

	public void saveFile(){
		Bitmap b = viewToBeCaptured.getDrawingCache();
		File sd = Environment.getExternalStorageDirectory();
		File f = new File(sd, "captureAndroid.png");
		try {
			if (sd.canWrite()) {
				Log.v("Saved", "Screenshot saved");
				f.createNewFile();
				OutputStream os = new FileOutputStream(f);
				b.compress(Bitmap.CompressFormat.PNG, 90, os);
				os.close();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		viewToBeCaptured.setDrawingCacheEnabled(false);
	}
}

Android: Configure ADB in MAC

Para configurar el adb del sdk de android debemos configurar el path a la instalación de nuestro sdk.

Para hacerlo, debemos abrir un terminal de mac y escribir lo siguiente:

export ANDROID_SDK=/carpeta donde tenemos descargado nuestro sdk/android-sdk-mac_86
export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SDK}/platform-tools

Una vez echo esto, ya podemos escribir en el terminal adb y el comando deseado (por ejemplo adb logcat).

Hasta aquí hemos configurado el adb, pero para no tener que hacer esto cada vez que encendamos nuestro mac, podemos poner estas dos líneas en el archivo .bash_profile, de esta manera se quedará guardado para un futuro.

Para hacerlo escribimos en un terminal:

nano ~/.bash_profile

Y pegamos las dos líneas que hemos escrito anteriormente.

Android: Create AlertDialog with custom layout

A continuación veremos como crear un AlertDialog personalizado, añandiéndole nuestro propio layout como view.

A continuación el layout que hemos usado:

Android: Locale. Get current language

Para detectar el idioma que tiene predefinido un móvil, debemos usar la siguiente línea de código: