sábado, 30 de marzo de 2013

Práctica de SEMPRECELTA publicada en Google Play Store

Hola,
ya he publicado mi práctica en Google Play Store (la de SEMPRECELTA), le voy haciendo cambios (voy por la 3ª versión) ya que en cada móvil se ven algunos layouts de manera diferente; pero mejorandola cada día
Iré añadiendo nuevas funcionalidades semana a semana. A los celtistas espero que os guste.

Saludos,

Laura.

viernes, 22 de marzo de 2013

Método para comprobar si nuestro dispositivo tiene conexión de datos activa

Un método sencillo para comprobar si nuestro dispositivo móvil tiene conexión de datos activa, es el siguiente:




 Devuelve true en caso afirmativo, y false en caso contrario.

Inicialización de CameraUpdateFactory

Al subir una aplicación al Play Store nos encontrabamos con el error:
* java.lang.NullPointerException: CameraUpdateFactory is not initialized

Buscando por internet se dice que es necesario inicializarla aunque el eclipse no lo pida, para solventarlo añadiremos el siguiente codigo:

try {
MapsInitializer.initialize(this);
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}

jueves, 21 de marzo de 2013

Error en el comando MSDOS para obtener SHA1

En windows Xp a veces el comando

keytool -list -alias androiddebugkey -keystore C:\Lugar\donde.Esté.la carpeta de tu keystore\debug.keystore -storepass android -keypass android -v

no funciona, dando un error como este:

Opci¾n no permitida:  and
keytool -list [OPTION]...

Cuando pase esto, es porque DOCUMENTS AND SETTINGS no es un nombre de carpeta válido, por lo que hay que reducirlo a :
Docume~1

Espero que os sirva! :D

Error al abrir google-play-services_lib

Qué hacer cuando sale esto al intentar abrir la librería google-play-services_lib

The project description file (.project) for 'google-play-services_lib' is missing. This file contains important information about the project. The project will not function properly until this file is restored.

Esto ocurre cuando por algún motivo la librería ha perdido el archivo .proyect.

Primero seguimos estos pasos:

1.- Asegúrate de que tienes descargados los últimos plugins con el SDK manager (en mi caso fue este error, desinstalé el ADT y no instalé los plugins de nuevo). En caso de verlo instalado, desinstálalo y vuelve a instalarlo.


2.- Click File -> Import...,
select Android -> Existing Android Code into WorkspaceBrowse to and 
select <android-sdk-folder>/extras/google/google_play_services/libproject/google-play-services_lib
Project -> Properties -> Android -> Library, Add -> google-play-services_lib. 

Tras eso debiera funcionar, si sigue fallando... reinstalad el sdk y si sigue fallando, el ADT completo... si tras eso falla de nuevo... quemad el pc :D (o buscad en google)

(fuente de ciertos pasos: http://stackoverflow.com/questions/15270586/google-play-services-in-eclipse-has-stopped-working)

miércoles, 20 de marzo de 2013

miércoles, 13 de marzo de 2013

Copiar base de datos desde la carpeta assets

Para copiar una base de datos desde assets, debemos introducir el siguiente código dentro de la clase BaseDatosHelper :


Una vez echo esto, dentro de la clase CapaAccesoDatos debemos introducir el siguiente código


Donde debemos modificar com.paquete.ejemplo por el nombre de nuestro paquete. Con esto ya tenemos la base de datos guardada dentro de la variable database y podemos manipularla como queramos

martes, 12 de marzo de 2013

Como usar php para conectar android a MySQL

Leed y "disfrutad":

http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/

http://www.coderzheaven.com/2011/04/08/android-phpmysql-connection/

http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/

Los tres links lo explican, yo voy a usarel primero, que lo explica TODO, paso a paso.

Inicialmente explica qué es un WAMP (windows, apache, mysql, phpmyadmin) y nos enseña a usar uno en nuestro pc para ser nosotros nuestro propio host. Nosotros usaremos un host externo: http://www.000webhost.com

Tras enseñarnos a montar nuestro propio server y montar nuestra aplicación web en php (un vídeo y unos links que no son necesarios si creamos nuestra BBDD en 000webhost), nos explica como crear una base de datos. Los pasos son parecidos, salvo que lo hacemos en 000webhost (el phpmyadmin de 000webhost no es muy diferente del que instalas con el WAMP).

Tras crear la base de datos, le ponemos datos y pasamos a crear archivos PHP para el manejo externo de la base de datos (php permite controlar una base de datos haciendo uso de un método POST para introducir consultas). Nosotros vamos a crear esas consultas predefinidas.


************************************************************************************************************
Yo las he creado y he puesto un par en mi servidor, pero no devuelven lo que yo quiero. Y eso ocurre porque en el primer link para los archivos php usan una variable llamada __DIR__ que solo existe en versiones de php 5.3 o mayores. Hay que usar dirname(__FILE__). (explicado aquí: http://stackoverflow.com/questions/2749416/is-there-any-difference-between-dir-and-dirname-file-in-php)(otro truco para saber si vuestra versión de php soporta esa variable, es ponerle esto en cualquier parte del código php).
var_dump(dirname(__FILE__));
var_dump(__DIR__);

Si salen 2 direcciones por pantalla, todo ok, si solo sale 1, usad dirname :D
************************************************************************************************************

Al usar esta variable más vieja, más rápida y más versatil, los archivos devuelven esto: 

http://herbinhas.comyr.com/herbalife_app/get_todos_productos.php

Es el resultado de una consulta SELECT * from productos.

Una vez creados todos los archivos .php con nuestras consultas (recordad que hay que modificar los archivos que aparecen en la página, para que coincidan con los campos de las tablas de nuestra base de datos), creamos los archivos .java necesarios y los layout necesarios. Recordad cambiar las URL del ejemplo para vuestros servidores.

Recordad buscar en la página la clase JSONParser.java... está hacia el final, y no dice nada sobre que hay que crearla, porque por defecto, este parser no existe en el SDK.(hay cosas parecidas). Aquí ya depende mucho de vuestro proyecto. En el ejemplo se usan botones e intents. Podéis modificar los archivos .java para que usen menús, fragments... o lo que se os ocurra.

lunes, 11 de marzo de 2013

Como crear desplazamiento horizontal (android 5 views desktop)


No sólo de intents vive Android.

Hay maneras igual de efectivas para cambiar el contenido de un layout, con efectos... más llamativos. Pero lo llamativo tiene un precio en complicación.

Se pueden usar fragments para otra cosa distinta que un mapa. Como por ejemplo, crear un fragment personalizado, donde aparezca lo que te dé la real gana. Como por ejemplo, un escritorio de 5 vistas de Android.

Si queréis ese efecto de "5escritorios" o "5layouts" en los que desplazaros lateralmente, os leéis esto, lo entendéis, lo implementáis y me lo explicáis :D

http://wptrafficanalyzer.in/blog/implementing-horizontal-view-swiping-using-viewpager-and-fragmentpageradapter-in-android/

En esta página se explica como usar un viewpager(elemento de un layout, en XML), una clase fragment(será nuestro contenedor para las referencias y lógicas de negociación del contenido del fragment) y una clase fragmentPageAdapter (por decirlo de alguna manera, el oncreate del fragment como elemento). A parte, se crea un layout nuevo para el contenido del fragment. (No sé si lo he explicado bien, o si se entiende, si es confuso, bienvenidos a mi mundo, os lo explico con detalle si me preguntáis).


La otra manera de entender esto (la mía) es copiar y pegar, y luego ejecutar con un montón de LOGS.D(), ver como funciona y modificarlo según tus necesidades. Un consejo, si vais a usar esto, os recomiendo que tengáis claro qué queréis conseguir, porque es complicado. Cuando logre entender exactamente como funcionan las clases que usan, lo explico más detalladamente, con imágenes de mis resultados.

Obtener nombre de la localización a través de google places

Usando los datos de longitud y latitud se puede obtener el nombre de las ubicaciones a través de google places, necesitamos tener el proyecto configurado para google maps como hemos visto antes, esto hace necesario tener la API_KEY, importada la google_play_services_lib y añadida al proyecto.

El código usado sería algo parecido a esto:


// Elemento geocoder en el contexto
Geocoder geocoder = new Geocoder(mContext);
// Elemento list que contendra la direccion
List<Address> direcciones = null;

// Funcion para obtener coger el nombre desde el geocoder
try {
direcciones = geocoder.getFromLocation(latitud, longitud,1);
} catch (Exception e) {
Log.d("Error", "Error en geocoder:"+e.toString());
}

// Funcion que determina si se obtuvo resultado o no
if(direcciones != null && direcciones.size() > 0 ){

// Creamos el objeto address
Address direccion = direcciones.get(0);

// Creamos el string a partir del elemento direccion
direccionText = String.format("%s, %s, %s",
                    direccion.getMaxAddressLineIndex() > 0 ? direccion.getAddressLine(0) : "",
                    direccion.getLocality(),                  
                    direccion.getCountryName());
}

El elemento geocoder es el encargado de obtener los datos a partir de la latitud y la longitud.
Esta información la almacenamos en un objeto List y el tipo de datos será Address. El objeto List es un grupo de objetos tipados, similar a un array. Los datos Address son Strings de datos que contienen direcciones.
Por último creamos otro objeto Address para obtener los campos de la dirección que deseamos y lo ponemos en un String.
Con String.format indicaremos el formato del texto a introducir, la primera parte indica el formato donde %s son variables de tipo string y lo obtenemos de de las lineas siguientes con los get.

Por último ya podemos mostrar la dirección almacenada en direccionText. Se recomienda usar un proceso runnable e hilos o una asynctask.



Facilito los códigos de una clase creada para obtener la localización, hay que introducir la API_KEY en el manifest:

https://www.dropbox.com/s/66l4gyefp7gms81/geolocejemplo.rar

Documentación:
Objeto Address
Objeto List
Objeto Geocoder




Página para buscar iconos

http://www.iconfinder.com

Tiene miles de imágenes (libres), puedes elegir el tamaño de las mismas, y el fondo: blanco, negro o transparente. Disfrutadlo.

viernes, 8 de marzo de 2013

Crear un nuevo fichero de claves (debug.keystore)

En ocasiones, el SHA1 que nos da el debug.keystore no lo acepta Google. Es decir, creas un API KEY en Google con la SHA1 que te da .android/debug.keystore, y cuando intentas abrir un mapa en tu aplicación te da problemas, es decir, Google no te acepta la clave.

La solución sería crear un nuevo fichero de claves, que te dará un nuevo SHA1.

Para realizar esto, abrimos el fichero de AndroidManifest.xml en Eclipse, y pulsamos sobre la pestaña Manifest, y una vez ahí elegimos "Use the export Wizard".


La primera ventana la dejamos igual, ya que es el nombre del proyecto.
Pulsamos siguiente y nos muestra un formulario para crear una nueva clave:

Una vez pulsamos tenemos que configurar la nueva clave, a la cual debemos darle la misma información es decir como alias pondremos androiddebugkey y como clave android.

Añadimos la información de la key, alias->androiddebugkey y password->android
Tal y como se muestra a continuación:


Elegimos la ruta del archivo apk, este fichero aquí no nos hará falta,es el archivo de instalación de nuestra aplicación. Le podéis dar cualquier ruta.


Ya tenemos creada el nuevo fichero de configuración, ahora tenemos que asignárselo a Eclipse, para que sepa que nuestras aplicaciones estarán vinculadas a él.
Window->Preferences
En Custom debug store elegimos nuestro fichero de clave, recién creado.




Ahora abrimos el cmd, y obtenemos nuestro SHA1, para decirle a Google que esa es nuestra clave, en nuestro ordenador asignado al debug.keystore creado (si utilizásemos otro ordenador, habría que crear otra)
Escribimos en la línea de comandos:
keytool -list -alias androiddebugkey -keystore c:/Users/tuusuario/debug.keystore -storepass android -keypass android -v

c:/Users/tuusario->es donde guardasteis la clave creada en Eclipse.


Y se obtendría SHA1


El SHA1 junto con el paquete de vuestro proyecto sería lo que tendríais que utilizar para crear una nueva API KEY en Google, y después asignársela a vuestro proyecto en el AndroidManifest.


Mostrar siempre la información de un Marker


Cuando creamos un Marker en un mapa, no siempre muestra la información del marcador por defecto. Es decir, si tenemos el código siguiente, nos mostraría algo como lo que se ve en la imagen de abajo.

Marker miMaker=miMapa.addMarker(new MarkerOptions()
.position(lugar)
.title(title)
.snippet(info)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.escudo))
.anchor(0.5f,0.5f));


Entonces si queremos que se muestre la información del marcador debemos utilizar el método showInfoWindow(), quedando el código de la siguiente manera:

Marker miMaker=miMapa.addMarker(new MarkerOptions()
.position(lugar)
.title(title)
.snippet(info)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.escudo))
.anchor(0.5f,0.5f));
miMaker.showInfoWindow();

Ahora ya se vería la información del marcador cuando abrimos el mapa, sin tener que pulsar sobre dicho marcador.



jueves, 28 de febrero de 2013

Como poner el número de las líneas en eclipse

Para cuando da esos errores nullpointerexception y solamente te dan el número de linea donde falla:

Se puede habilitar el ver el número de líneas y así buscar el error más fácilmente:

Botón derecho sobre la línea azul donde se colocan los breakpoint: y seleccionamos ShowLineNumbers


Más sobre Widgets

Si quieres saber más sobre Widgets puedes consultar este enlace
Mas_sobre_Widgets1
Mas_sobre_Widgets2

jueves, 21 de febrero de 2013

Obtener los nombres de los ficheros almacenados en res/raw

Si quieres obtener los nombres de los ficheros que están almacenados en /res/raw tan sólo tienes que ejecutar este método y obtendrás todos los nombres de los recursos en el array fields

public void listRaw(){ 
   Field[] fields=R.raw.class.getFields();
   for(int count=0; count < fields.length; count++){
     Log.i("MIO", fields[count].getName());
   }
}




martes, 19 de febrero de 2013

Personalizando un Adaptador


Hay Componentes que necesitan de Adaptadores para nutrirse de datos y personalizar el aspecto. En ocasiones es posible que necesitemos ciertos datos que  no tengamos disponibles directamente desde el evento del componente asociado a ese Adaptador

Siempre existirá la posibilidad de personalizar el Adaptador y añadir las funciones necesarias para recuperar el dato/datos que necesitemos.

Por ejemplo, podremos recuperar el ID de un recurso asignado a un ImageView en una Galería.

Evento en MainActivity
En el Adaptador solamente es necesario crear una función que recuperé ese dato, en este caso del Array de recursos que tenemos y que es el que utilizamos en la Galería.

Función en el Adaptador utilizado por la Galería de Imágeneres(Gallery)

Simplemente, hacer referencia a este aspecto para tener en cuenta que siempre podemos utilizar el Adaptador para recuperar los datos que creamos necesarios en cualquier momento.

Salu2!

jueves, 14 de febrero de 2013

Cambiar el fondo de una linea del listView al pulsarlo

En primer lugar definimos un xml dentro de la carpeta drawable (por ejemplo list_magenta, que define el color de fondo a magenta y al clicar se pone en gris)



Luego dentro del método getView() del adaptador debemos introducir la siguiente linea de código:

  • Para APIs posteriores a 16 debemos utilizar:





  • Para APIs anteriores tenemos un método que está deprecated:


Automatizar getters y setters con eclipse

Al crear una clase en la que ponemos atributos únicos para esa clase, es necesario crear los métodos get() y set() parara cada atributo, para poder manejarlos.

Eclipse tiene un generador de estos métodos, para que no se escriban a mano:
3 sencillos pasos:
1 Menú Source->Generate Getters and Setters
2 Seleccionar los atributos para los que queremos los getter/setter
3 Pulsar OK



miércoles, 13 de febrero de 2013

Recuperar el nombre del recurso de la imagen seleccionada usando el atributo "Tag"

Si queremos mostrar en un Toast, o en otro control , el nombre de la imagen sobre la que hacemos "click" de un control Gallery podemos apoyarnos en el atributo Tag del control ImageView.

1º paso: establecer el "tag" en los imageView de la Gallery.

Lo primero que debemos hacer es establecer el valor del atributo Tag en el momento de asociar las imágenes al control Gallery (en el getView del adaptador).


En este fragmento de código, obtenemos primero el nombre del recurso y lo almacenamos en la variable "tag". 

Para ello usamos el método getResourceEntryName() pasándole como atributo el identificador de recurso de la imagen (en el ejemplo está almacenado en un array de imagenes, pero sería lo correspondiente a R.drawable.id_del_recurso).

Una vez que tenemos el nombre del recurso en la variable "tag", lo establecemos en el ImageView correspondiente usando el método setTag().


2º paso: recuperar el valor almacenado en el "tag" de la imagen seleccionada

Ahora, vamos al método donde se captura el evento "click" sobre la imagen de la Galería.


En este fragmento de código nos situamos en el método onItemClick(). Aquí recibiremos el ImageView "clickado" en el parámetro "v". Sobre este parámetro solo tenemos que lanzar el método getTag() y aplicarle una conversión al tipo String para obtener el nombre del recurso almacenado previamente en el primer paso.


Añadir un estilo a un Gallery


En primer lugar debemos definir dentro de styles.xml la etiqueta para personalizar un elemento individual de la galería, en este caso el galleryItemBackground.


Luego debemos definir el atributo anteriormente creado dentro del constructor del adaptador de la galería, como vemos en el siguiente código :


Y seteamos el fondo creado dentro del método getView() del adaptador con setBackgroundResource()




martes, 12 de febrero de 2013

Retardar la ejecución de código durante "X" tiempo

Si tenemos un fragmento de código que queremos que tarde un cierto tiempo  en ejecutarse ( en mili segundos) podremos hacer lo siguiente:

-Primero creamos un Handle


- Dentro de mHandle tenemos un función llamada .postDelaye y  que nos pedirá dos atributos, el primero es para la función ( Runnable) donde irá el código a ejecutar después de ese tiempo y el segundo el tiempo en mili segundos.




y por ejemplo ejecutamos el siguiente código:


En este caso al pasar los 5 segundos ( 5000 milisegundos ) se ejecuta run que llama a doStuff para mostrar el Toast con su correspondiente texto.

Fuente :

http://stackoverflow.com/questions/4111905/how-do-you-have-the-code-pause-for-a-couple-of-seconds-in-android

(el segundo post)

Saludos!!


lunes, 11 de febrero de 2013

Combinación de teclas para AVD

El siguiente enlace indica la relación entre las teclas del emulador y las teclas del teclado.
Muy útil si en algún momento no están visibles los botones en el avd.

http://developer.android.com/tools/help/emulator.html

Acceder a todos los recursos de colors.xml

Se puede acceder a todos los recursos de colors.xml para almacenarlos en un array mediante el siguiente método

// Crear un array con todos los campos de colors.xml
Field[] fields = R.color.class.getDeclaredFields();
// Crear un array de los names y sus valores
String[] names = new String[fields.length];
int[] colors = new int[fields.length];
// Acceder a los valores
try {
    for (int i = 0; i < fields.length; i++) {   
       names[i] = fields[i].getName();   
       colors[i] = fields[i].getInt(null);   
       Log.e ("MIO","nombre "+names[i]);   
       Log.e ("MIO","entero "+colors[i]);
    }
} catch (Exception ex) { }

Debemos importar

import java.lang.reflect.Field;

viernes, 8 de febrero de 2013

Métodos para asignar una imagen a un ImageView


Para una referencia a un control ImageView llamado a_miImageView

1.      Por el identificador R del recuso imagen


a_miImageView.setImageResource(R.drawable.tablet);

2.      Por el nombre de la imagen


String nombre="tablet"; //nombre fichero sin extensión

String recurso="drawable";

int res_imagen = getResources().getIdentifier(nombre, recurso,getPackageName());

a_miImageView.setImageResource(res_imagen);

viernes, 1 de febrero de 2013

Landscape cambio de orientación

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Toast.makeText(this, "pepe", Toast.LENGTH_SHORT).show();
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }

<activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main"
            android:configChanges="orientation|keyboardHidden|screenSize">

http://danielme.com/2012/09/17/rotaciones-de-pantalla-en-android/
http://es.softuses.com/192240
http://techerald.com/page/configuracion-ha-cambiado-cambio-de-orientacion-y-la-destruccion-de-actividades---es-esta-la-forma-en-que-su-supone-que-funciona.html
http://www.elandroidelibre.com/2010/05/aprendiendo-android-i.html
http://proyectosimio.wordpress.com/2012/12/30/programacion-android-ciclo-de-vida-de-una-app/

Gestion de proyectos Android en Eclipse

Todo buen@ programad@r debe saber como organizar su código y reutilizar éste con buenas prácticas.
El siguiente enlace explica la forma de crear librerías propias e incorporarlas a cualquier proyecto
http://developer.android.com/tools/projects/projects-eclipse.html

miércoles, 30 de enero de 2013

Como saber qué es un error o una advertencia

De vez en cuando cometemos errores o eclipse nos da advertencias sobre como mejorar nuestro código.

Algunas veces no sabemos exactamente de que se trata.

Para ello, ponemos el cursor sobre el código con problemas o advertencias y pulsamos CTRL+1 (F1 NO!). Saldrá un menu desplegable con la opción: Explain Issue, que nos mostrará un texto explicativo algo más detallado. Si el texto es muy grande, para que aparezcan las Scrollbar, tenemos que clicar sobre el texto amarillo.


Permitir backups


Hoy en día las acciones Backup&Restore son muy usadas debido a las actualizaciones de OS, o fallos múltiples y diversos (al enviar tu móvil a arreglar aunque sea una tecla, le hacen un bck&rst en casi todas las compañías...)

Normalmente las aplicaciones descargadas y sus datos no son guardadas con el backup, pero con las últimas api's (17), en el AndroidManifest.xml de nuestros proyectos se añade una nueva línea por defecto:


android:allowBackup="true" (true por defecto)


Así, habilitamos a la infraestructura de Android, al realizar un backup, a que guarde esta aplicación y sus datos.
Fuente: http://developer.android.com/reference/android/R.attr.html#allowBackup


Esto tiene varias consecuencias: la positiva, el usuario final puede hacer un backup de nuestras aplicaciones y no la pierda, pero puede causar algo negativo: un error de seguridad: con el USB debugging activado, se puede sacar el backup fuera del dispositivo y se puede leer los datos de backup.

Link de Stackoverflow:

http://stackoverflow.com/questions/12648373/what-is-androidallowbackup


Cambiar la imagen de un ImageView manteniendo la posición de la imagen anterior

Tenemos una aplicación que va moviendo una imagen hacia arriba y hacia abajo, y además también se le puede modificar la imagen que muestra en pantalla

Que pasa, si hemos movido una imagen hacia abajo, y ahora queremos cambiar la imagen pero manteniendo la posición de la imagen anterior?

Pues para asignar la nueva imagen, habría que utilizar el siguiente código (primero asignamos la  nueva imagen y después asignamos la posición de la anterior imagen)




Un ejemplo visual.

Tenemos una imagen y la movemos hacia abajo:

Elegimos la imagen 3:

Se ha cambiado la imagen y sigue en la misma posición que la anterior:



Chronometro con etapas


El objetivo es crear un chronometro con etapas a modo de aprendizaje, mediante un botón podremos controlar el inicio y pausa del cronómetro. Una vez iniciado el cronómetro, en cada pausa mostraremos los segundos transcurridos desde la última vez que el cronómetro estaba parado o en pausa, llegando a mostrar como mucho os 6 últimos intervalos en funcionamiento.


Ejemplo cronómeto

Documentación base para el desarrollo:
http://developer.android.com/reference/android/widget/Chronometer.html
http://developer.android.com/reference/android/widget/Chronometer.html#setBase(long)
http://developer.android.com/reference/android/os/SystemClock.html#elapsedRealtime()

La función setBase() ajusta el tiempo del cronómetro en referencia al parametro que se le pase de tipo long. Recomiendan utilizar elapsedRealtime() como base. Esta función devuelve en milisegundos el tiempo transcurrido desde que se inició el ordenador.

Elementos y controles de pantalla necesarios:

ToggleButton tBtn; Chronometer  chR; TextView lapsView;
Variables necesarias (es posible que no todas sean imprescindibles):
boolean started = false; //Controlamos si se ha iniciado por primera vez o no long total_elapsed; // Tiempo total que ha pasado desde que estaba a 0 int lap; // numero de intervalos pausados. String timelaps = ""; // Texto para mostrar los intervalos

Funciones necesarias:

  • Función chStart para incio del cronómetro:

       public void chStart(){
 /*llamamos a la función que creamos setTimeBase() para establecer el momento de inicio del cronometro */
                 setTimeBase();
                //iniciamos el cronometro
chR.start();
}

  • Funcion setTimeBase() para establecer el inicio del cronómetro:
         public void setTimeBase(){
//Combrobamos si el inicio es por primera vez o no.
if (!started)
{
                        //Si es por primera vez establecemos como base el tiempo actual del sistema
chR.setBase(SystemClock.elapsedRealtime());
                        // lo marcamos como iniciado
started = true;
}
else
{
                        //Si ya fué iniciado anteriormente, establecemos a la base le añadimos el tiempo total que ha transcurrido
chR.setBase(SystemClock.elapsedRealtime()+total_elapsed); 
}
}

  • Función dentro del OnClick del ToogleButton


// Comprobamos si está iniciado
if ( tBtn.isChecked() )
{
//Iniciar el cronómetro llamando a nuestra funcion chStart()
chStart();
}else
{
              /*Si ya ha sido iniciado primero creamos una variable para almacenar la duración de la última vuelta, si es la última vuelta (la anterior) sería 0. */
long last_lap_duration = total_elapsed;
// Guardamos el tiempo total transcurrido.
total_elapsed = chR.getBase() - SystemClock.elapsedRealtime();
            // Calculamos y guardamos en una variable local  la duración de la última parada 
         long lap_duration = total_elapsed - last_lap_duration;
// Paramos el cronómetro
chStop();
           // Aumentamos la variable de control de vueltas.
lap++;
//Controlamos el envío a pantalla de las vueltas, en función de si ya se ha superado el límite de 6 o no.
if (lap <=6 )
{
showInterval(lap_duration);
}
else
{
timelaps ="";
lap = 1;
showInterval(lap_duration);
}
}
Funciones adicionales:

//Muestra el intervalo en pantalla

public void showInterval(long lap_duration){
timelaps += getResources().getText(R.string.interval) + "\tnº\t" + lap + ":\t"+ getTextMiliseconds(lap_duration) + " \t segundos \n";

lapsView.setText(timelaps);
}
//Devuelve el valor de la variable long en segundos con decimales
public String getTextMiliseconds(long miliseconds) {
float seconds =  ((float)miliseconds /(float) 1000) * -1 ;
String time = "";
time += String.valueOf(seconds);

return time;
}


Resultado:


Un saludo