jueves, 17 de abril de 2014

Desarrollo de un app Android (4) - Iniciando otra actividad.

Desarrollo de un app Android (4)

Responder al botón Send


Para al evento on-click, abrimos nuestro layout main.xml y agregamos el atributo android:onClick a la vista <Button>. Con lo cual nos queda como el siguiente código:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage"/>


android:onClick tiene como valor "sendMessage", el cual es el nombre del método que será implementado en nuestra Activity y que será ejecutado cuando el usuraio haga click en el botón.

Abre tu Activity e implementa el método de la siguiente manera:

/** Método que se ejecuta cuando el usuario pulsa el botón Send 
public void sendMessage(View view){
    // Hacer algo en respuesta el evento on-click
} 

Debes tener en cuenta que este método debe cumplir las siguientes características:

         1. El método debe ser "public"
         2. "void" como valor de retorno
         3. Debe tener un "view" como único parámetro ( es la View que fue clickada)

Ahora en este método podríamos por ejemplo capturar  el texto de EditView y enviarlo a otra activity.

Construir un Intent ( intención )



Un intent es un objeto que vincula componentes separados en tiempo de ejecución; como por ejemplo dos actividades. Un intent representa "una intención de hacer algo"; se pueden usar en una amplia variedad de tareas, siendo la más común iniciar otra activity.
Manos a la obra. Dentro del método sendMessage creamos un Intent MostrarMensajeActivity

Intent intent = new Intent(this, MostrarMensajeActivity.class);
 
Debes importar :
 
import android.content.Intent; 



Truco: Si trabajas con Eclipse puedes pulsar Ctrl+Shift+O para importar clases.

El constructor usado para instanciar un Intent recibe dos parámetros:
Context:
Como primer parámetro this por que Activity es subclase de Context
Class:
Es el componente del app al cual se le enviara el intent; en nuestro caso será la clase que será iniciada.


Como hemos mencionado un Intent no solo permite iniciar otras actividades; también podemos enviar información dentro del intent que será útil a la actividad que iniciamos. Dentro del método sendMessage() usamos findViewById() para obtener el EditView y añadir el valor de su texto al intent:

Intent intent = new Intent(this, MostrarMensajeActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
 
Nota: Ahora debemos importar android.widget.EditText y definir la constante EXTRA_MESSAGE. Es buena práctica definir el nombre de los extras de un intenet con el nombre del package en caso interactuemos con otras apps.

public class MainActivity extends ActionBarActivity {
     public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
     ...
}
 

Iniciar la segunda actividad


Para iniciar la segunda actividad lo hacemos con el método "startActivity()" y le pasamos el "intent". El sistema recibe la llamada e inicia la actividad especificada en el intent. Con todo esto nuestro método sendMessage() quedaría así:

public void sendMessage(View view) {
     Intent intent = new Intent(this, MostrarMensajeActivity.class);
     EditText editText = (EditText) findViewById(R.id.edit_message);
     String message = editText.getText().toString();
     intent.putExtra(EXTRA_MESSAGE, message);
     startActivity(intent);
}

Creando la segunda activity


Lo hacemos como indicamos en el artículo I : Desarrollo de un app Android (1) - Creando un proyecto Android.

Nos queda algo así:

public class MostrarMensajeActivity extends ActionBarActivity {

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

    ...}

Añadir el título a String



Abrimos el fichero strings.xml e introudcimos el sigueinte código 
<resources>
    ...
    <string name="title_activity_display_message">My Message</string>
</resources>

Con el fin de mejorar la eficiencia del diseño cuando se especifica el peso se debe cambiar el width(ancho) del EditText a cero (0dp).

<EditText
        android:layout_weight="1"
        android:layout_width="0dp"
        ... />
 

Añadir la segunda actividad al manifest



Abrimos el fichero strings.xml e introudcimos el sigueinte código 
<resources>
    ...
   
<string name="title_activity_display_message">My Message</string>
</resources> 
Con el fin de mejorar la eficiencia del diseño cuando se especifica el peso se debe cambiar el width(ancho) del EditText a cero (0dp).

<application ... >
    ...
    <activity
        android:name="com.pelusadev.myfirstapp.MostrarMensajeActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.pelusadev.myfirstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.pelusadev.myfirstapp.MainActivity" />
    </activity>
</application>

Recibir el intent



En el método onCreate() e introducimos el siguiente código 
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

Mostrar el mensaje



En el método onCreate() de MostrarMensajeActivity introducimos el siguiente código:
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
} 
 
Este post está divido en: