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

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

viernes, 29 de marzo de 2013

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 - 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

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

lunes, 25 de marzo de 2013

Android - abrir ventanas/Activity

En este pequeño tutorial intentare explicar como desde una ventana/ pantalla/ o como se les llama en android Activity, abrir otra.

Lo primero que debemos hacer es crearun proyecto en android, nos servira el de Hola mundo que habiamos creado en un tutorial pasado, si no lo as visto te recomuendo pasar por el tu primer proyecto en android despues meteremos un texto para saber en que ventana estamos y un boton que sera el encargado de enviarnos a la siguiente ventana; esto deberiamos poderlo hacer simplemente arrastrando los elementos desde la paleta a nuestro Activity, aunque tambien podemos hacerlo editando el XML; deberia queda algo como la imagen de abajo.


Despues deberemos dirigirnos a la carpeta res/layout de nuestro proyecto y hacer un click derecho para ir a new>Android XML File en caso de que no nos aparezca hay podemos ir a other y dentro de la carpeta Android seleccionarlo.

se nos abrira una ventana parecida a la de mas abajo en la que debemos escribir el nombre que tendra la nueva ventana, recuerda que debe empezar por una letra y no puede contener mayusculas despues de esto podemos configurar algun detalle en next o darle a Finish.

Editaremos la vista de esta nueva Activity añadiendo un texto que la diferencia de la anterior, como podemos ver en la imagen de abajo.

Bueno, parece que ya tenemos todo echo no?? pues queda lo mas importante decirle donde y como abrirlo, para ello debemos crear la actividad (activity) que va a ser la encargada de lanzar esta vista; para ello iremos a la carpeta src/(el directorio de carpetas que hallamos declarado al inicio) y alli hacer click derecho> new >Class se nos abrira una ventana en la que debemos dar el nombre de la actividad, lo suyo es que tenga el mismo nombre que la vista (me parece haber leido en algun sitio que si no da errores), asi que tendremos un archivo con el mismo nombre de nuestra vista terminado en .java con un contenido similar al que sigue:

package org.rogama.lanzar2ventana;

public class ventana2 {

}

Justo al lao del nombre de la clase (ventana2) debemos extender a Activity quedando algo como lo que sigue:

public class ventana2 extends Activity {

Recuerda que si utilizas la ayuda de eclipse, NetBeans o el IDE que mas te agrade este debe añadirete las librerias, si no te tocara a ti añadir las referencias a mano, en este caso debemos importar android.app.Activity
Una vez hecho esto iremos hasta Source>override/Implement Methods... (para los que no esten familiarizados con esto, lo que estamos haciendo es sobreescribir un fragmento de codigo que nuestra Activity ya tiene definido, o bien por erencia o por extensiones)

Marcaremos la casilla onCreate(Bundle)

Y esto nos habra creado un codigo similar al sigueinte:

@Override 
 public void onCreate(Bundle savedInstanceState) {
 //TODO Auto-generated
        super.onCreate(savedInstanceState);
    }

Debajo de super debemos escribir lo siguiente:
setContentView(R.layout.ventana2);

Ahora en nuestro MainActivity.java debemos crear el siguiente metodo
public void lanzar2Ventana(View view){
      Intent inten = new Intent(this, ventana2.class);
            startActivity(inten);
    }


El modo mas sencillo ahora es ir a activity_main.xml, y en las propiedades del boton asocial este metodo al evento onClick, como mostramos en la imagen inferior.


Para finalizar deberemos ir al fichero AndroidManifest.xml y ayudandonos de la interfac grafica que nos tiene preparado Eclipse señalaremos la pestaña de Application y alli en la parte inferior izquierda, donde pone Application Nodes le damos al boton Add.

Seleccionamos Activity en la ventana que se nos abre y damos al boton de Ok, justo a su derecha se nos habilitara un menu donde podemos ingresar algunos parametros, en Name escribiremos el nombre de la ventana precedido por un . en nuestro caso .ventana2 y en label una pequeña descripción


Ya podemos lanzarlo y probarlo
Puedes ver y descargar todo el codigo desde: http://adf.ly/Ld3kj