lunes, 4 de julio de 2011
Debugging Android “Source not found” Errors
I had a problem with the Strings resources, as the compiler didnt say anything about it, but at runtime the resource for an String wasnt not found.
android.content.res.Resources$NotFoundException: String resource ID #0x7f050022
I have finally solve the problem cleaning the project from Eclipse. And due to the bad perfomance of the plugin sometimes is a common solution.
viernes, 24 de junio de 2011
Problem with DatePicker example on Android. Possible Android bug.
I am implementing a DateTimePicker. I have reuse this repository:
http://code.google.com/p/datetimepicker/
The problem appears when I am trying to catch the events for the onTimeChanged when I change the minutes. If I use the buttons of + and – Its fine, the event is fired and I can handle it here
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
// Update the internal Calendar instance
mCalendar.set(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), hourOfDay, minute);
}
Whereas when I click on the minutes and I change it using the keyboard the event doesnt arise, as in the case of the hours, days, etc…
A more detail description of the problem is:
What steps will reproduce the problem?
1. Select the timepicker
2. touch on the numbers, so the keyboard appear
3. when i write an amout of minutes, the event doesnt fire.
What is the expected output? What do you see instead?
I would expect to catch this event inside onTimeChanged, but I cant.
What version of the product are you using? On what operating system?
Version 2. On Android Froyo.
The author of this code has told me there is a bug on Android. I think should be a work around to this problem, for example creating my own class extending from TimePicker and reimplementing the interface OnTimeChangedListener.
miércoles, 22 de junio de 2011
¿Cómo puedo aprender inglés?
En más de una ocasión me han hecho esta pregunta, empezando por mí mismo. A continuación os dejo unos links que en su momento me resultaron de gran ayuda. Me gustaría compartir mi experiencia, ayudar a quien le interese, pero sobretodo tenerlo ya escrito para cuando me pregunten la próxima vez! J
El método depende de cada uno, evidentemente. Personalmente recomendaría estas pautas a un nivel medio que quiere conseguir un nivel alto. En mi caso fueron más o menos así.
Empezar escuchando Vaughan Radio: 30min/1h al dia. http://www.vaughanradio.com/ Te puedes bajar los podcast y llevarlos en el coche, escucharlos antes de dormir…
Practicar el speaking 30min. Para ello internet nuevamente nos supone una herramienta perfecta. Hay una comunidad muy buena, en la que pones tu idioma materno e intercambias con alguien que tenga interés en tu idioma y tú en el suyo. Se llama http://www.sharedtalk.com/
Para el reading que mejor que irse a Reading! jeje(este es un chiste para familiarizaros con el fino humor británico, no en serio! Cuál es la palabra más larga en ingles…SMILES, porque entre una S y la otra hay una milla de distancia…) Para el Reading empezar con libros que están marcados por niveles. Los hay en la biblioteca de la escuela de idiomas. También revistas, como SPEAK UP, muy buena y con un CD interesante.
Tampoco hay que descuidar la gramática y fonética. Para esto lo mejor es ir a una escuela, y si no, pues también hay muchos libros en pdf sobre gramática del inglés, boletines a los que suscribirse por email…Buscar en internet cualquier recurso para el First, Advance, IELTS, TOEFL…
Para la fonética hay unos videos muy buenos de la BBC: http://www.bbc.co.uk/worldservice/learningenglish/grammar/pron/
Una página con cantidad de recursos y de consejos es http://elblogdelingles.blogspot.com/
La autora de este blog y Richard Vaughan, son dos profesores que le ponen tanto entusiasmo a su profesión que de verdad hace que te interese el inglés. Claro está que debe de haber una motivación previa para ello. En mi caso fue poder leer libros técnicos para mi proyecto, foros, y demás recursos que tiene internet en materia de informática y teleco…Otros pueden ser la música, viajar a algún país...Y en cualquier caso lo recomiendo, pues aprender un idioma es una actividad muy estimulante, que puede tomarse como hobby y con la que puedes aprender cosas que ya tenías olvidadas. Como es el caso de los podcast http://www.bbc.co.uk/podcasts.
Una vez que se tiene un dominio intermedio-alto. Lo mejor sin lugar a dudas es irse un tiempo al país donde se hable ese idioma. Si no es posible, siempre hay posibilidad de conocer a personas inglesas en España. En Murcia por ejemplo hacen un tándem (Erasmus que quieren practicar español) en la cafetería Fitz Patrick (junto al Rex), o una comunidad llamada http://www.erasmusu.com/es/ Donde también conocer gente Erasmus. De esta forma es posible practicar el inglés como si estuviéramos en el país y mantener vivo el idioma. Una vez que tienes nivel suficiente es genial poder hablar con angloparlantes, y por ende con gente de casi cualquier nacionalidad, entender algunas canciones, ver algunas series, películas, etc…
miércoles, 15 de junio de 2011
Controlling Installation Preference
package="com.yourcompany.yourapplication.activitiy"android:versionCode="1"android:versionName="1.0" android:installLocation="auto">
miércoles, 16 de marzo de 2011
Acceder al código fuente de Android
La forma de hacerlo con el IDE Eclipse es instalando un plugin tal y como explican aqui
An easier way of getting the source into your Eclipse installation is to use the "Android Sources" plugin from http://code.google.com/p/adt-addons/ . Haris Peco maintains plugins with gives access to the Android Source code. Using the Eclipse update manager install two of his plugins. Update site: "http://adt-addons.googlecode.com/svn/trunk/source/com.android.ide.eclipse.source.update" and "http://adt-addons.googlecode.com/svn/trunk/binedit/com.android.ide.eclipse.binedit.update".
martes, 1 de marzo de 2011
Buscar información en la Red de Redes.
Uno de los aspectos más importantes en que ha cambiado Internet durante todos estos años, es la forma que tenemos para descubrir cosas nuevas. Antes este lugar lo ocupaba la televisión, las revistas, los periódicos. Desde la llegada de Internet a nuestra cotidianidad, a mediados de los 90s, el descubrir nueva música, películas y expresiones culturales en general, se transformo en una búsqueda activa. En un inexistente mapa del tesoro que se encontraba disperso en Yahoo o Altavista. Hasta que años después, el mensajero cambio de nombre y de algoritmo, y descubríamos las cosas en Google. Nos convertíamos así en cartógrafos, en descubridores, en navegantes. Había que tomar el lápiz para dibujar el camino.
Descubríamos porque buscábamos.
Pero poco a poco fueron apareciendo sitios que buscaban por nosotros. Que seleccionaban y nos regalaban una buena cantidad de recursos. Fue así como Internet se llenó de cartógrafos que nos indicaban un posible camino.
Por otro lado las redes sociales han cambiado el modo en que podemos acceder a la información, que al fin y al cabo la componen las vivencias de todos y cada uno de nosotros.
Estas redes aparecen en diversos contextos, y me sorprende ver el gran apoyo que ha supuesto a la comunicación en las últimas revoluciones de los países Árabes. Donde una población en busca de la libertad, ha podido expresarse libremente y comunicarse por medios como Twitter. Encontrando esa ansiada información, y demostrando como su acceso es vital para un buen funcionamiento global. Poniendo de manifiesto y de forma coherente que la tecnología mejora nuestra vidas.
Es importante encontrar "nuestro camino" y en el caso de Internet lo tenemos a un par de clicks, increíbles guías nos ofrecen sus blogs, tweets, foros, etc. Y nos ayudan a conocer sitios y experiencias que de otro modo serian difícilmente accesibles. Siempre teniendo cuidado de separar la paja, y no dejarnos caer en los grandes "vacíos" de esta ruta trazada cual descubridor de nuevos mundos.
miércoles, 23 de febrero de 2011
Manejo de Hilos en Android
Uno de los mayores quebraderos de cabeza en Android es el manejo de hilos.
No es posible acceder a las variables de la UI desde un hilo diferente del principal. Por tanto si después de realizar una operacion pesada(una comunicacion por red, acceso al GPS...) queremos actualizar un textview, debemos de pasar esa operacion dentro de un runnable al handler de la Activity. El handler es un objeto de la clase Handler, que una vez declarado en la clase principal, en nuestro ejemplo una Activity, permite interactuar con sus variables.
[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[ . . . ]
}
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults = doSomethingExpensive();
mHandler.post(mUpdateResults);
}
};
t.start();
}
private void updateResultsInUi() {
// Back in the UI thread -- update our UI elements based on the data in mResults
[ . . . ]
}
}
Otra forma de abordar el problema es mediante el uso de mensajes de nuevo con la clase handler. Como bien indica el SDK de android:
There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.
En este ejemplo tan sencillo, nos interesa utilizar el handler para pasar el control del programa desde el hilo que realiza la operacion en el background a el hilo principal, para que actualice el UI. Es decir, como ya hemos mencionado, no sería posible modificar el UI desde el hilo secundario, sino que tenemos que llamar al hilo principal(mediante el objeto hanlder)para que se ocupe de ello. El siguiente código NO SERIA CORRECTO:
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults = doSomethingExpensive();
updateResultsInUi(); //NO DEBE LLAMARSE AQUI.
}
};
t.start();
}
private void updateResultsInUi() {
//update our UI elements based on the data in mResults
[ . . . ]
}
Como comentaba antes, otro modo de comunicación con el handler es mediante el uso de mensajes, que equivale a hacer un "post(Runnable r)":
public class MyActivity extends Activity {
[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler(){ @override public void handleMessage(Message msg){ if(msg.what == 0) updateResultsInUi(); } };
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[ . . . ]
}
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults = doSomethingExpensive();
//mHandler.post(mUpdateResults); mHandler.sendMessage(0);
}
};
t.start();
}
private void updateResultsInUi() {
// Back in the UI thread -- update our UI elements based on the data in mResults
[ . . . ]
}
}