Mostrando entradas con la etiqueta Android. Mostrar todas las entradas
Mostrando entradas con la etiqueta Android. Mostrar todas las entradas

sábado, 13 de diciembre de 2014

Instalar Android 5, Lollipop y actualizar nuestras app

Hoy os escribo entre felicidad y tristeza, por que quiero daros la grata noticia de que el ultimo portal que abrimos dedicado exclusivamente a Android esta teniendo una gran acogida por muchos de vosotros, y nuevos amigos que se nos unen en esta loca aventura de aprender, crecer y tener muchos dolores de cabeza con nuestros pequeños o no tan pequeños terminales de nuestro querido robótico, para los que aun no sepáis cual es ese portal os dejo la URL http://www.todo-android.gratis/ allí tendremos las mejores reviews de vuestras aplicaciones y otras que nos parezcan interesantes, al igual que de los terminales, widget, y accesorios para nuestros teléfonos, sin olvidarnos de lo que ya llevamos tiempo haciendo aquí mismo, trucos, tutoriales, y pequeños tips de programación.

viernes, 12 de diciembre de 2014

Android - Instalacion Eclipse + ADT

Os deje a medias en mi ultima entrada, pero después de varias horas, peleando con ello, y sin que terminara de funcionar, quedando solo a la espera de unas descargas... que por cierto el ADSL me va fatal por lo que los 100Mb de descarga del eclipse me tardan una eternidad.
Hoy os confirmo que después de volver a descargar eclipse, ya de paso me bajado la ultima versión: Luna Service Release 1 (4.4.1), abra que quedarse con el lado bueno que es tenerlo todo actualizado, después de haber perdido una tarde entera...
Tan solo tenemos que instalar el plugin ADT,

jueves, 11 de diciembre de 2014

Android - DDMS files not found: C:\adt-bundle-windows-x86_64-20130729\sdk\tools\hprof-conv.exe

Hoy al abrir eclipse después de una larga temporada que me ha mantenido ocupado programando únicamente en PHP, me encontrado con el siguiente error DDMS files not found: C:\adt-bundle-windows-x86_64-20130729\sdk\tools\hprof-conv.exe

En eclipse si vamos hasta Window --> Preferences

jueves, 19 de junio de 2014

Cambiar la imagen de un ImageView - Android

Para cambiar la imagen de un ImageView En un evento en concreto es muy sencillo, tan solo debemos inicializarlo en el OnCreate de nuestra clase, y después usar el siguiente código:
miImageView.setImageResource(R.drawable.imagen);
Si queremos complicarlo un poco mas, podemos parametrizarlo en las preferencias del usuario por ejemplo y recuperar desde allí un String con el nombre de la imagen, podremos acceder a su Id, y asignarlo al ImageView de la siguiente manera:

domingo, 15 de junio de 2014

Salto de linea en textos dentro del archivo string - Android

Como ya sabemos todos para trabajar con traducciones, y como buena practica en Android es incluir todos los textos en nuestro archivo strings.xml.

Pero que pasa si queremos un texto en varias lineas?
-Podemos introducir distintos TextView, uno para cada linea
-O podemos hacerlo en condiciones, y añadir los saltos de linea en nuestro texto en la variable de nuestras string.

Para introducir un salto de linea solo tenemos que escribir los caracteres \n al final de cada linea.

Os dejo un ejemplo

    <string name="acerca_de">Juego 3 en raya \n
Desarrollado por RoG@Ma Informática.\n
www.rogamainformatica.es</string>

Espero os sirva de ayuda

sábado, 14 de junio de 2014

Android - cannot execute task the task has already been executed (a task can be executed only once)

Al usar las AsyncTask en android puede aparecer el siguiente error:
cannot execute task the task has already been executed (a task can be executed only once)
Esto es debido a que estamos intentando ejecutar 2 veces un mismo hilo, y eso no es posible, lo que si podemos hacer es lanzar un nuevo hilo que ejecute la misma tarea.

Seguramente tengamos algo similar a lo siguiente

public void lanzaAsincrona(View view) {
downloadTask.execute(uri);
}

En donde downloadTask esta igualado posiblemente en el onCreate de la siguiente manera
downloadTask = new myDownloadTask();
de esta forma creamos una nueva instancia de nuestra clase en la variable downloadTask, si borramos esa linea en el onCreate, y la copiamos dentro del método lanzaAsincrona, lo arreglaremos, ya que cada vez que llamemos a ese método crearemos una nueva instancia, por lo que se ejecutara en un nuevo hilo; debería quedar algo así

public void lanzaAsincrona(View view) {
downloadTask = new myDownloadTask();
downloadTask.execute(uri);
}

o en su versión resumida
public void lanzaAsincrona(View view) {
new myDownloadTask().execute(uri);
}

Espero os sirva de ayuda

Android - asynctask an error occurred while executing doInBackground

En ocasiones podemos encontrarnos con el siguiente error:
asynctask an error occurred while executing doInBackground
Al usar una tarea asincrona tenemos que tener cuidado y estar seguro de lo que hacemos, desde un hilo secundario no podemos hacer varias cosas, entre ellas modificar la apariencia del Layut, lanzar un Toast, etc ...

Si intentamos ejecutar alguna de esas acciones seguramente nos de este error, si en nuestra app necesitamos ejecutar alguna tarea, y que esta misma cambie, algo o lance un mensaje (Toast) tenemos metodos especificos para ellos, estos son ejecutados justo antes, o despues de ejecutar la tarea, estos metodos son:

               @Override
protected String doInBackground(String... params) {
//Aqui ejecutaremos la tarea de nuestro hilo asincrono
}

@Override
protected void onPostExecute(String result) {
//Esto se ejecutara al terminar el hilo, es decir la tarea ejecutada en el doInBackgroun
}

@Override
protected void onPreExecute() {
//Esto se ejecutara antes de ejecutar la tarea del doInBackground
}

Tanto en el metodo OnPreExecute, como en el OnPostExecute, es el lugar ideal para lanzar Toast, o cambiar elementos de la interfac

Espero os sirva de ayuda.

viernes, 13 de junio de 2014

Android - Tareas Asincronas

Hacia tiempo que no os traía novedades, pues bien hoy os traigo algo de lo que no habíamos hablado hasta ahora y como son las tareas asincronas en Android.

En este ejemplo muy sencillo basado en el ejemplo que viene para explicar el modo de hacerlo aunque incompleto... del libro Android 4 de ediciones ENI del autor Nazim Benbourahla.

En dicho ejemplo tenemos un layout con un botón y una progressbar, aunque esta ultima oculta, y desde su activity creamos una nueva clase la cual extiende de AsyncTask, y es el método doInBackground el que se encarga de llevar a cabo las tareas en 2 plano, en el ejemplo simplemente dormimos el hilo durante un segundo en cada una de las 10 pasadas del bucle for

Tenéis todo el código en:

https://github.com/rogama/Android---Tareas-Asincronas

Espero os sirva de ayuda

jueves, 22 de mayo de 2014

Habilitar menu desarrollador en Galaxy S4

Todos los que tenemos un Galaxy S4 e intentamos desarrollar con el, nos ha pasado, o pasara, que no encontramos el menu desarrollador, para asi poder habilitar la depuracion por USB, por lo que tenemos 2 opciones.
  1. Crear el APK e instalarlo con cada prueba
  2. Volvernos locos e intentar activarlo a cualquier coste
Si eres de los que les gusta el riesgo, toma la segunda opcion, para ello tenemos que seguir 3 pasos
  • Iremos a ajustes, y alli a la pertaña Mas
  • Bajaremos hasta la opcion Acerca del dispositivo
  • Buscaremos Numero de compilacion, y pulsaremos encima 7 veces (a partir de la 4 o 5 nos aparecera un mensaje "Toast" que nos dira cuantas veces nos hace falta seguir pulsando)
  • Si volvemos hacia atras, ya tenemos nuestro querido menu habilitado, tan solo tendremos que marcar las opciones que querramos


fuente:

sábado, 17 de mayo de 2014

java.lang.IllegalStateException: Could not find a method Close(View) in the activity - Android

Muchos de nosotros estamos acostumbrados a poner un botón de cerrar en nuestras vistas, dicho botón, lo solemos vincular en el método OnClick con un método Close, como en la siguiente linea.
android:onClick="Close"
Esto nos lleva a escribir un método similar al siguiente:
    public void Close() {
        finish();
    }
Pero ese código nos lanzara un error de este tipo:
java.lang.IllegalStateException: Could not find a method Close(View) in the activity 
Esto es debido a que probablemente por las prisas hallamos olvidado que nuestro método necesita que se le pase una vista, por lo que el código correcto seria:
    public void Close(View view) {
        finish();
    }

viernes, 16 de mayo de 2014

you need to use a theme.appcompat theme (or descendant) with this activity - Android

En ocasiones podemos encontrarnos con un error como este:
unable to start activity componentinfo
.....
you need to use a theme.appcompat theme (or descendant) with this activity
esto es debido a que probablemente estemos usando un tema personalizado en una Activity, que en realidad es un ActionBarActivity, esta ultima clase necesita usar el tema appCompat, por lo que deberemos ir a nuestro manifest, y editar el Theme de la actividad a lo siguiente
android:theme="@style/Theme.AppCompat" >
Aunque también podemos hacer que nuestra actividad extienda de Activity en lugar de ActionBarActivity, para ello habría que cambiar
public class MainActivity extends ActionBarActivity {
por
public class MainActivity extends Activity {
Escogeremos en cada caso la opción que mas nos interese

miércoles, 14 de mayo de 2014

Acceder a recursos de un Fragment desde un Activity mediante findById - Android

Hoy os dejo algo que me ha llevado un buen rato.
Todos los que aprendimos o hicimos nuestros pinitos hace ya algun tiempo con Android aprendimos que para "linkar" un elemento de una activity a nuestro archivo java, para poder trabajar con el, ya sea un botón, un Text View o cualquier otra cosa accediamos con un codigo similar a este.
salida = (TextView)findViewById(R.id.textView1);
Esto mismo normalmente lo colocabamos en el onCreate de nuestro Activity, pero desde hace ya algun tiempo lo que se viene usando son los Fragment, un fragment viene siendo una parte de lo que se va a ver en el Activity, puede ser el 100% o una pequeña parte, asi un Activity, puede estar formado por 1 o mas Fragment, en resumidas cuentas eso es lo que es.

Pues bien el problema esta en que si desde nuestro Activity, intentamos llamar a un textView que esta en nuestro Fragment como en el ejemplo superior, nos dara un error de tiempo de ejecucion, y si lo bicheamos un poco, veremos que aunque R.id.textView1 tiene un valor hexadecimal, a nuestra variable Salida sigue con null, esto es debido a que desde nuestra Activity no podemos acceder a los elementos del Fragment, para ello deberemos ir a la clase PlaceHolderFragment que nos ha creado Eclipse, y llamarlo desde alli como en el codigo que os dejo a continuación

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        public PlaceholderFragment() {
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            entrada = (EditText)rootView.findViewById(R.id.numEntrada);
            salida = (TextView)rootView.findViewById(R.id.numSalida);
            return rootView;
        }
    }
Espero os sirva de ayuda

Tambien os dejo el ejemplo completo y funcionando
https://github.com/rogama/Android---vista-boton-fragment

asi era como se hacia sin los Fragment
https://github.com/rogama/Android/tree/master/MasVistas

domingo, 23 de febrero de 2014

This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in

Hoy me encontrado con este error :
This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in

Justo hoy he arrancado un nuevo proyecto Android y la versión de destino es la 4.4.2 por lo que he actualizado el SDK, instalando dicha versión y descargando las actualizaciones de las anteriores que se me quedaron anticuadas, para mi sorpresa cuando abro el activity no tenia nada visible, y me aparecía dicho error después de ir a help -> check for Updates y que me dijera que no tenia ninguna actualización estaba desconcertado y googleando encontré lo siguiente:

http://stackoverflow.com/questions/18852983/eclipse-reports-rendering-library-more-recent-than-adt-plug-in

Allí dicen simplemente que le demos a help -> install New Software, en donde veremos una pantalla como la siguiente


Allí deberemos teclear la siguiente URL: https://dl-ssl.google.com/android/eclipse/

y seleccionar Developer Tool; darle a Next y esperar a que termine, cuando lo haga nos dirá que necesita reiniciar eclipse, le diremos que si y listo

Un saludo y espero que os sirva de utilidad.

domingo, 14 de abril de 2013

viernes, 29 de marzo de 2013

Android - Menu

Hoy vamos a ver como crear un menu; es decir que cuando apretemos la tecla de menu en nuestro terminal nos salga el ya famoso menu abajo con las distintas opciones que le demos, para hacer esto es muy sencillo con eclipse.
Vamos a crear una aplicacion de ejemplo para este proposito; la llamaremos MenuEjemplo, una vez la tengamos creada se nosabrira el activity_main.xml, lo dejaremos como esta, y abriremos la carpera res alli iremos hasta menu y sorpresa nos encontramos un main.xml, en este ejemplo vamos a aprobecharlo, aunque si queremos hacer uno de 0 deberiamos hacer click derecho añadir android xml y seleccionar que sea del tipo menu

si hacemos doble click sobre main.xml se nos abrira algo como lo que sigue

marcaremos el unico elemento que contiene este menu para eliminarlo y asi dejarlo de 0, dando al boton de Remove

Ahora le daremos a Add y en la ventana que se nos abre seleccionaremos Item

en el menu del item que nos sale al lado le daremos un Id, en este caso vamos a dejar que nos da por defecto @+id\item1 y en Title escribiremos el texto que queremos nos salga en pantalla en este caso Boton de Mernu 1

Y repetimos la misma operacion otra vez

Ahora nos iremos a nuestro mainActivity.java, en el podemos ver que tenemos sobreescrito un metodo onCreateOptionsMenu, es aqui donde debemos programar lo que desemos acerca del menu, con la linea en la que nos pone
getMenuInflater()inflate(R.menu.main, menu);

nos esta vinculando esta activity con el menu que acabamos de editar

ahora sobreescribiremos el siguiente metodo on OptionsItemSelected, borrando el codigo de super de su interior, y escribiendo lo siguiente

    @Override public boolean onOptionsItemSelected(MenuItem item) {
             switch (item.getItemId()) {
             case R.id.item1:
                    Toast toas= Toast.makeText(getApplicationContext(), "Boton de menu numero 1", Toast.LENGTH_LONG);
                    toas.show();
                    break;
             case R.id.item2:
                    Toast toas2= Toast.makeText(getApplicationContext(), "Boton de menu numero 2", Toast.LENGTH_LONG);
                    toas2.show();
                    break;
             }

             }
             return true
    }

En el que simplemente creamos un Switch y segun que boton pulsemos mostramos un mensaje emergente u otro.

el codigo esta disponible en : http://adf.ly/Ls07f 

Android - recibir respuesta desde Activity

Siguiendo el tema que abrimos ayer, y trabajando sobre la misma aplicacion vamos a abrir una nueva ventana, pasandole unos datos, y que esta al cerrarse nos diga si todo a sido correcto, y nos devuelva otros datos; para ello vamos a ir a nuestra aplicacion y alli abreremos ventana2.java en donde para empezar creamos un boton en ventana2.xml, y le asignamos en la funcion onClick la funcion enviarConRespuesta que ahora declararemos declararemos; fuera del metodo OnCreate nuestros editText, para tenerlos accesibles desde toda la clase

public class ventana2 extends Activity{
    EditText textNombre;
    EditText textEdad;
    .....

una vez hagamos esto declararemos la siguiente funcion

    public void enviarConRespuesta(View view) {
        Intent intent= new Intent(this, abriendoPorCodigo.class);
        intent.putExtra("nombre", textNombre.getText().toString());
        intent.putExtra("edad", textEdad.getText().toString());
        startActivityForResult(intent, 0000);
    }


La cual lo unico que hace es declarar una neuva intencion, en la cual abriremos la vista que esta vinculada a abriendoPorCodigo.java; la pasamos 2 datos "extra", los cuales son los textos que tenemos escritos en los EditText, y el secreto viene en la ultima linea, en la que lanzamos la intencion, pero en modo espera de resultado, y le damos un codigo nuestro, para asi que cuando cierre sepamos que nosotros le habiamos mandado y esperamos datos, ya que desde android, cualquier aplicacion puede lanzar activity incluso de otras aplicaciones; despues sobre escibiremos el metodo onActivityResult el cual es el encargado de esperar la respuesta de la otra activity

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 0000 && resultCode ==RESULT_OK){
            String resultado = data.getExtras().getString("resultado");
           
            Toast toast = Toast.makeText(getApplicationContext(), resultado, Toast.LENGTH_LONG);                    toast.show();
        }
    }

Borramos el codigo que nos mete por defecto eclipse que lo unico que hace es llamar al super(); y en su lugar escribimos un filtro, para que solo actue cuando le llegue el codigo que nosotros hemos definido antes, y que ademas el resultado sea Ok; en ese caso recogemos el "extra" del resultado, o respuesta que nos da la otra activity, y la mostramos en un mensaje emergente.

Por otro lado en abriendoPorCodigo.xml, le borramos el texto al textView que teniamos preparado y en abriendoPorCodigo.java escribimos el siguiente codigo dentro del metodo OnCreate:

        Bundle extras = getIntent().getExtras();
        String nombre = extras.getString("nombre");
        String edad = extras.getString("edad");
       
        TextView label = (TextView) findViewById(R.id.txtVMuestra);
        label.setText("Nombre: " + nombre + ", Edad: " + edad);
       
        String textResultado ="Recibido: " + label.getText();
       
        Intent intent = new Intent();
        intent.putExtra("resultado",textResultado);
        setResult(RESULT_OK, intent);
        //finish();

Donde declaramos un Bundle para rescatar los datos enviados por el activity anterior, y le asignamos al textView esos datos, con una pequeña etiqueta descriptiva delante de cada uno; tambien declaramos una variable a la que le asignamos el texto "recibido" y le añadimos el texto que tnemos en el TextView; para finalizar declaramos una intencion simple, en la que añadimos un extra llamado resultado, y le damos el valor declarado en la variable anterior, le asignamos el resultado en Ok, y lo mandamos junto con la intencion.
Opcionalmente podemos añadir la funcion finish(); que lo que hace es cerrar la activity una vez llega a esa linea, por lo que no llegariamos a verla, tan solo notariamos un pequeño parpadeo en pantalla desde que la intentamos abrir desde el activity anterior hasta que vuelve al mismo; prueba hacerlo funcionar con y sin esa linea ;)

Como de costumbre publico el codigo en GitHub aqui te dejo el enlace: http://adf.ly/LkOgw ;)

jueves, 28 de marzo de 2013

Android - mostrar mensaje emergente

Esto suena a algo muy basico, y en realidad lo es, aunque como todo, hay que conocerlo; aqui os dejo hoy el codigo para mostrar un mensaje emergente en nuestras aplicaciones android, podemos ponerlo para que se ejecute al pulsar un boton, al ocurrir un error o cuando nosotros elijamos

Toast toast = Toast.makeText(getApplicationContext(), "texto del mensaje", Toast.LENGTH_LONG);            toast.show();

poco que decir aqui, simplemente lo declaramos, le pasamos el String con el texto y el tiempo de duraccion, para en la linea siguiente lanzarlo

Android - Pasar datos desde una Activity a otra

Apollandonos en el ejemplo de ayer hoy simplemente he copiado el proyecto, le he cambiado el nombre mediante refactor, solucionado algunos errores que daba por referencias al antiguo nombre y editado un pelin las vistas; si os parece mas sencillo podeis crearos un nuevo proyecto para probar esto, o nuevas vistas y usarlas como vamos a ver, yo queria dejar esto en un proyecto aparte para que os podais descargar el codigo desde Git como viene siendo habitual y no dependais del otro proyecto, ni tengais que andar buscando un fragmento de codigo por todo el proyecto.

Bueno manos a la obra, como os he dicho he editado las vistas, en el caso de activity_main.xml he dejado solamente un boton enorme.
En su clase MainActivity.java he eliminado todo lo que hicimos ayer, y en la funcion de lanzar2ventana he dejado el siguiente codigo

    public void lanzar2ventana(View v) {
        Intent inten = new Intent(this, ventana2.class);
        inten.putExtra("usuario", "Ramon");
        inten.putExtra("edad", 25);
        startActivity(inten);
    }

En donde tan solo nos llaman la atencion estas lineas
        inten.putExtra("usuario", "Ramon");
        inten.putExtra("edad", 25);
dentro de la funcion la primera linea como ya sabemos declara una intencion, y en estas lineas añadimos un par de "extra" a esa intencion, esto debe hacerse por parejas, es decir ("nombre o referencia por lo que lo vamos a buscar" , "dato")
como vemos arriba pasamos un String y tambien un int; despues lanzamos la intencion

Por otro lado en ventana2.xml he creado 2 label uno con un texto fijo que pone nombre y otro que pone edad, debajo de cada uno tengo 1 EditText para cada dato

En ventana2.java este codigo:
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ventana2);
       
        Bundle extras = getIntent().getExtras();
        String nombre = extras.getString("usuario");
        int edad = extras.getInt("edad");
   
        EditText textNombre = (EditText) findViewById(R.id.TxtNombre);
        EditText textEdad = (EditText) findViewById(R.id.txtEdad);
       
        textNombre.setText(nombre);
        textEdad.setText(Integer.toString(edad));
    }

En el cual dentro de la funcion onCreate (fuera no funcionara) declaramos un Bundle al que le asignamos los valores de los extras que le hemos pasado desde el otro Activity, despues declaramos una variable del tipo String y mediante extras.getString("nombre del parametro que queremos recuperar") recuperamos el nombre del usuario; y hacemos lo propio con la edad, pero esta vez recuperandolo como un int.

Declaramos los 2 EditText (ya veis que funciona igual que con los botones)
y finalmente les asignamos los valores recuperados, a la edad le hacemos casting, ya que a un EditText no se le puede asignar un int debe ser un texto

En este punto ya podemos lanzar el proyecto y verlo funcionando ;)
Puedes descargarte todo el codigo o verlo desde aqui http://adf.ly/LkOgw

miércoles, 27 de marzo de 2013

Java/Android - hacer cast a int

Es algo obvio pero en ocasiones se puede olvidar y hoy a sido mi caso.
Normalmente cuando programamos en Java, ya sea para Android, web, o aplicaciones de escritorio, estamos acostumbrados a hacer casting de la siguiente manera
(Tipo al que queremos converitr) variable o dato que queremos convertir; un ejemplo de esto seria

int numero= (int) "26";

El problema esta justo en el caso contrario, si queremos convertir un entero a un String por ejemplo para mostrarlo en un EditText, ya que (String) 26 pasara bastante de nosotros, y es que a los tipo primitivos como son char, int, creo que boolean y no se si me dejo alguno mas no se les puede hacer casting de esta manera, para el caso de un int debemos recurrir a Integer, y la conversion seria de la siguiente manera:

Integer.toString(26)

Pudiendo hacer con ello lo que queramos ya como String

Espero os sea util y os quite muchos quebraderos de cabeza ;)

martes, 26 de marzo de 2013

Android - Lanzar ventanas por codigo

Hoy veremos como lanzar una Activity por codigo, si lo se es lo mismo que hicimos ayer, pero por codigo?? con lo sencillo rapido y facil que lo hicimos ayudandonos del diseño; esto tiene una razon de ser y es que en versiones anteriores a la 1.6 de Android no existe el evento onClick tal y como lo conocemos, que aunque no creo que desarrollemos muchas aplicaciones pensando en esa version , es bueno conocerlo por si acaso, ademas abra a quien se le halla pasado por la cabeza en lugar de usar el metodo onClick usar el onLongClick que es el que sucede cuando pulsamos durante mas de un segundo, si la memoria no me falla, para este evento y otros muchos no disponemos de interfac, aunque se puede hacer siempre igual y es aqui donde toma cabida esta entrada.

En primer lugar vamos a crear otra vista y otra activity para la nueva vista, la declararemos en el AndroidManifest.xml; todo esto como ya hemos visto en la entrada de ayer, a ver si os acordais ;)
abrir ventanas/activity aqui os dejo el enlace de apollo.

partiendo de que ya tenemos creada la vista, con un texto que distinga a las anteriores, la Activity de esa vista, con el metodo onCreate sobreescrito (override) y asignado a la vista todo ello declarado en el manifest, y un segundo boton en activity_mail.xml el cual ahora programaremos que cuando pulsemos nos lleve a la nueva vista, recordar que esto ya lo vimos ;)

DesdeMainActivity.java declararemos un boton, justo debajo de la declaracion de la clase, quedando algo asi:
public class Asteroides extends Activity {
private Button BtnTerceraVentana;

Esto funciona de manera similar a cualquier otra variable, ahora mismo no hace nada es solo un objeto de un boton pero sin nada asociado, sin funcionalidad alguna.
En el OnCreate le asignaremos el boton que nos interesa en cuestion
BtnTerceraVentana =(Button) findViewById(R.id.Button02);
BtnTerceraVentana.setOnClickListener(new OnClickListener() {
      public void onClick(View view) {
           lanzarVentanaPorCodigo(null);
      }
});
En la primera linea a nuestro boton le asignamos el boton de la vista
En la segunda le damos funcionalidad al evento OnClick, asignandole un "escuchador", esto nos genera la tercera linea, que tan solo es el evento Onclick (casi nada) dentro de los corchetes deberemos escribir lo que queramos que haga, en la entrada anterior vimos como lanzar un activity, te ves capaz de hacerlo solo??

Puedes declarar una funcion, la cual debe declarar un Intent, que llame a la nueva vista y lanzar su activity; o hacer esto mismo directamente en el evento onClick, para gustos los colores, ya ves que en el ejemplo yo llamo a una funcion
Todo el codigo en : http://adf.ly/Ld3kj