Bienvenidos sean a este post, hoy veremos dos formas mas de actividades la primera sera el intercambio de datos entre ellas y la segunda sera como crear un menu en nuestras actividades.

Anuncios

Para aprender estas tecnicas vamos a crear el siguiente proyecto:

  • Dispositivos: Phone and Tablet
  • Actividad: Empty Activity
  • Nombre: ActividadesPlus
  • Nombre de paquete: org.example.actividadesplus
  • API Minimo: API 14 (Android 4.0)
Anuncios

Para esta ocasion vamos a crear un proyecto muy parecido al anterior por lo que solamente les pasare los codigos pero si quieren saber como trabaja les recomiendo visitar el post anterior pasemos a la primera modificacion:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="30dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal|center_vertical"
        android:textSize="24sp"
        android:layout_marginBottom="20dp"
        android:text="Actividad 1" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:onClick="lanzarOtraVista"
        android:text="Prox. Actividad" />
</LinearLayout>
Anuncios

Este va a ser nuestro layout principal donde tendremos un TextView y un Boton relacionado a una funcion, pasemos al siguiente codigo:

MainActivity.java

package org.example.actividadesplus;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void lanzarOtraVista(View vista){
        Intent i = new Intent(this, OtraVista.class);
        startActivity(i);
    }
}
Anuncios

Aca esta nuestro codigo principal para llamar al layout anterior y poder ejecutarlo, si hasta ahora tuvieron errores no se preocupen porque se iran solucionando con las modificaciones, para nuestra siguiente modificacion debemos crear un nuevo layout para eso hace click con el boton derecho sobre la carpeta res, seleccionan New -> Android Resource File y completan el cuadro con los siguientes datos:

  • File name: otravista
  • Resource type: Layout
  • Root element: LinearLayout
  • Source set: main
  • Directory name: layout
Anuncios

Con esto completo procedemos a presionar Ok para generar el nuevo layout, luego modificaremos el codigo creado automaticamente con el siguiente:

otravista.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:padding="20dp">

    <TextView
        android:id="@+id/otrotexto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="Otra Vista" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Volver a vista anterior"
        android:textSize="20sp"
        android:onClick="volverVista"/>

</LinearLayout>
Anuncios

En este caso tenemos un codigo muy similar al anterior pero con una sutil diferencia, para este caso agregamos la siguiente linea en el elemento TextView:

android:id="@+id/otrotexto"
Anuncios

Esta linea nos permite darle un identificacion a nuestro elemento, siempre va a tener la misma sintaxis, es decir primero el @+id seguido del nombre a identificarlo, pero basicamente es igual al codigo de activity_main.xml, nuestra siguiente modificacion sera agregar una clase para este layout y para ello haremos click con el boton derecho sobre el contenedor de clases Java y seleccionaremos New -> Java class, aparece un nuevo cuadro y lo completan de la siguiente forma

Anuncios

Este caso es para Android Studio en Linux pero si lo hacen en Windows deberan elegir el modificador de acceso como publico (Public), una vez creado nuestra nueva clase modificaremos el codigo existente con el siguiente:

OtraVista.java

package org.example.actividadesplus;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class OtraVista extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.otravista);
        TextView texto;
        Bundle extras = getIntent().getExtras();
        String t = extras.getString("texto");
        texto = (TextView) findViewById(R.id.otrotexto);
        texto.setText(t.toString());
    }

    public void volverVista(View vista){
        Intent i = new Intent(this, org.example.actividadesplus.MainActivity.class);
        startActivity(i);
    }
}
Anuncios

Esta clase tendra el metodo para mostrar el layout otravista y tambien tendra un metodo para volver a la actividad principal, si lo probaramos en este instante no funcionara porque todavia no declaramos la nueva actividad, para ello vamos a modificar el codigo de nuestro manifiesto con el siguiente codigo:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.example.actividadesplus">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".OtraVista"
            android:label="Esta es otra vista" />
    </application>

</manifest>
Anuncios

En este basicamente lo que agregamos fue la declaracion de la actividad con este pequeño bloque:

        <activity android:name=".OtraVista"
            android:label="Esta es otra vista" />
Anuncios

Con esto tenemos nuestra aplicacion ya completamente funcional, ahora procederemos a hablar sobre nuestra primera practica como es la comunicacion entre actividades, lo cual nos dara la posibilidad de poder enviar informacion de una actividad a la otra, procedamos con la primera moidificacion y para ello vamos a tomar el siguiente metodo:

    public void lanzarOtraVista(View vista){
        Intent i = new Intent(this, OtraVista.class);
        startActivity(i);
    }
Anuncios

De la siguiente manera:

    public void lanzarOtraVista(View vista){
        Intent i = new Intent(this, OtraVista.class);
        i.putExtra("texto","La otra actividad");
        startActivity(i);
    }
Anuncios

Al igual que vimos en el post anterior, para crear y utilizar nuestras actividades utilizamos la clase Intent para crear los objetos y por medio del metodo startActivity iniciamos nuestro objeto creado y la actividad en si, para agregar la posibilidad de enviar informacion utilizaremos el metodo putExtra(), el primer campo sera el identificador (tag) y el segundo sera el valor a enviar, puede ser de cualquier tipo y en este caso enviaremos cadena de texto (string) pero lo mas complicado va a estar cuando debamos recuperarlo, para eso debemos pasar a la otra clase Java, OtraVista, para ello veamos primero el bloque onCreate de esta clase:

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.otravista);
    }
Anuncios

Ahora haremos algunas modificaciones:

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.otravista);
        TextView texto;
        Bundle extras = getIntent().getExtras();
        String t = extras.getString("texto");
        texto = (TextView) findViewById(R.id.otrotexto);
        texto.setText(t.toString());
    }
Anuncios

En este caso vamos a agregar cinco nuevas lineas, analicemos una por una para ver su funcion para esto vamos con la primera:

TextView texto;
Anuncios

En esta linea crearemos nuestro objeto del tipo TextView llamado texto, esto sera util para poder tener acceso a las propiedades del elemento del tipo TextView de nuestra vista por medio del codigo java, esta es una simple declaracion en algunas lineas mas adelante veremos como establecer a quien relacionarlo, ahora pasemos a la siguiente linea:

Bundle extras = getIntent().getExtras();
Anuncios

Bundle al igual que Intent son clases que se utilizan para el intercambio de datos, en este caso para recuperar lo enviado por Intent, en esta linea generamos un objeto llamado extras al cual le diremos por medio de dos metodos getIntent y getExtras debe recuperar la informacion enviada, con estas dos opciones dentro del objeto pasemos a la siguiente linea:

String t = extras.getString("texto");
Anuncios

En este caso crearemos una variable del tipo String (cadena) llamada t a la cual le diremos que por medio del objeto creado en la linea anterior aplicaremos el metodo getString y le diremos que busque el tag (identificador) llamado texto, esto es gracias al metodo getExtras de la linea anterior sabe que debe buscar un dato enviado por putExtra, con esto le definiremos el valor enviado con el identificador texto a la variable t, en el caso de que fuera otro tipo, por ejemplo entero (Int) deberemos crear una variable de tipo Int y utilizar el metodo getInt para recuperar la informacion, ahora pasemos a la siguiente linea:

texto = (TextView) findViewById(R.id.otrotexto);
Anuncios

En esta linea vamos a definir al objeto antes creado, primero le diremos que es uno de tipo TextView, es decir que entre parentesis siempre definiremos el tipo de elemento el cual deberia coincidir con el mismo al cuando lo creamos, despues utilizamos el metodo findViewById, el cual se encargara de buscar por medio del Id el elemento que le indiquemos, en este caso R.id.otrotexto, la clase R es una que se crea automaticamente con todos los resources (recursos) y por medio del recurso id es otra forma de decirle que utilice este campo, hablo sobre estos dos en este post, con esto definimos que texto estara vinculado al elemento TextView llamado otrotexto, ahora pasemos a la ultima linea:

texto.setText(t.toString());
Anuncios

En esta linea simplemente setearemos el texto de nuestro elemento TextView, almacenadoo en el objeto texto, por medio del metodo setText, la informacion sera la definida en la variable t y por medio del metodo toString la convertiremos al tipo string (cadena), quedandonos una app como se ve en el siguiente video

Si lograron lo mismo que en el video podemos proseguir con el siguiente ejercicio, en este caso como agregar un menu a nuestra actividad.

Anuncios

Los menus son unas opciones para poder acceder a las actividades en dispositivos de poca resolucion o pantalla pequeña de forma mas optima, en general estan relacionadas a un boton el cual nos permitira acceder al mismo, para poder crear el mismo debemos ir al recurso principal llamado res y hacer click con el boton derecho y elegiremos New -> Android resource file donde nos aparecera un nuevo cuadro y lo completaremos de la siguiente manera:

  • File name: menu_ppal
  • Resource type: Menu
  • Root element: menu
  • Source set: main
  • Directory name: menu
Anuncios

Con esto hemos creado nuestro layout para el menu, nuestro siguiente paso sera modificar el codigo generado automaticamente por el siguiente:

menu_ppal.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity" >
    <item android:id="@+id/actividad_1"
        android:title="Actividad 1"
        android:icon="@android:drawable/ic_menu_preferences"
        android:orderInCategory="100"
        app:showAsAction="never" />

    <item android:id="@+id/actividad_2"
        android:title="Actividad 2"
        android:icon="@android:drawable/ic_menu_info_details" />

</menu>
Anuncios

En este codigo primero definiremos el contexto donde se utilizara y cuales son los recursos a utilizar, luego crearemos dos items, el primero estara relacionado a la actividad 1 y el segundo estara relacionado a la actividad 2, un dato el orden de los elementos en el menu estara en este caso dado por el elemento orderInCategory, en caso de no informarlo el orden sera acorde a como se agregan los mismos, en este ejemplo primero aparecera actividad 2 y luego el de actividad 1, para nuestro siguiente paso haremos una modificacion mas para poder utilizar nuestro menu, vamos al archivo otravista.xml y agregaremos el identificador para nuestro layout para ello agregaremos la siguiente linea en el elemento LinearLayout:

android:id="@+id/otravista"
Anuncios

En este caso es simplemente una identificacion para poder acceder a este layout por medio de la siguiente modificacion, para ello vamos a de nuevo a MainActivity donde agregaremos el siguiente bloque en la clase:

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.menu_ppal, menu);
        return true;
    }
    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();
        if (id == R.id.actividad_1){
            return true;
        }
        if (id == R.id.actividad_2){
            lanzarOtraVista(findViewById(R.id.otravista));
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

Analicemos el nuevo bloque, para ello vamos a ver este nuevo metodo:

public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}
Anuncios

En este bloque se utilizara para crear el boton de menu en la pantalla, donde agregara el contenido del archivo menu_main.xml y sale por medio de un return true, ahora veamos el siguiente metodo:

public boolean onOptionsItemSelected(MenuItem item){
    int id = item.getItemId();
    if (id == R.id.actividad_1){
        return true;
    }
    if (id == R.id.actividad_2){
        lanzarOtravista(findViewById(R.id.otravista));
        return true;
    }
    return super.onOptionsItemSelected(item);
}
Anuncios

Este item sera utilizado para cuando seleccionemos algun item del menu, primero crearemos una variable llamada id, a la cual le asignaremos por medio del metodo getItemId() y el item selecccionado, luego utilizaremos un condicional donde si el valor de id coincide con el item actividad_1 (por medio de la clase R y el recurso id), en este caso como no debemos ir a ningun lado simplemente enviaremos un return true para que se quede aqui y salir del condicional, luego usaremos otro condicional donde chequea si id coincide con actividad_2 y en caso afirmativo ejecutara el metodo lanzarOtravista() donde le informaremos por medio del metodo findViewById(), por este motivo fue necesario asignarle un ID al layout, para poder ir al mismo, con esto salimos del condicional por medio del return true y luego por medio de la ultima linea haremos que se ejecute la opcion seleccionado en cualquiera de los dos condicionales, si todo queda bien podemos probarlo y debera quedar como se ve en el siguiente video

Anuncios

Si lograron lo visto en el video, felicitaciones!!! porque han logrado hacer correctamente los pasos vistos en este post, antes de finalizar veamos como quedaron nuestro codigo modificado recientemente:

MainActivity.java

package org.example.actividadesplus;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void lanzarOtraVista(View vista){
        Intent i = new Intent(this, OtraVista.class);
        i.putExtra("texto","La otra actividad");
        startActivity(i);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.menu_ppal, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();
        if (id == R.id.actividad_1){
            return true;
        }
        if (id == R.id.actividad_2){
            lanzarOtraVista(findViewById(R.id.otravista));
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
Anuncios

En resumen, hoy vimos como se puede intercambiar informacion entre vistas, esto es muy util por ejemplo para juegos donde necesitaremos pasar un puntaje o algun otro dato entre distintas vistas los cuales pueden ser los niveles del mismo, tambien hemos visto como crear un menu para nuestras apps junto con las actividades, esta va a ser mas util pensando en dispositivos con pantallas pequeñas o con poca resolucion y como poder conseguir un elemento para poder agregarlo en nuestro metodo. Espero les haya sido util, sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00