Como evitar que se reinicie la activity al girar el movil

Objetivo:

Como evitar que se reinicie nuestra activity tras un giro del móvil.

Esto ocurre porque el método onCreate es llamado por defecto, según el ciclo de la vida de una aplicación Android, al girar el móvil. Podemos evitar que ello ocurra.

Lo conseguiremos fácilmente de dos posibles formas: mediante código Java incluido en nuestra Activity, o XML incluido en nuestro Android Manifest.xml:Como evitar que se reinicie nuestra activity tras un giro del móvil.

Para la versión en Java sólo tendríamos que colocar una función dentro de nuestra Activity:

Código fuente java:

[sourcecode language=”java”]
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.myLayout);
}
[/sourcecode]

Si preferimos la versión XML, debemo colocar la siguiente etiqueta dentro del fichero Android Manifest.xml de nuestra aplicación, en la etiqueta activity de nuestra actividad.

Código fuente XML:

[sourcecode language=”xml”]
android:configChanges="orientation"
[/sourcecode]

Como realizar acción tras esperar unos segundos con postDelayed

Objetivo:

Realizar una acción que deseemos tras esperar unos segundos.

Hay momentos en los que desearemos, que transcurridos unos segundos, nuestra aplicación ejecute una acción determinada automáticamente (por ejemplo, en un juego en el que tenemos solamente 1 minuto de partida, que acabado dicho minuto, se pare y muestre un mensaje de fin).
Ello lo conseguiremos facilmente aplicando un retraso (postDelayed) a un manejador (handler).
El ejemplo que a continuación programamos consiste en un aplicación en la que, tras 5 segundos de pulsar un botón, la aplicación se cierra automáticamente:

Captura de pantalla

Captura de pantalla - Realiza accion tras unos segundos

Código fuente java (/src/Principal.java):

[sourcecode language=”java”]
package com.acciontrassegundos.tutorialandroid;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;

public class Principal extends Activity {

public static int MILISEGUNDOS_ESPERA = 5000;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

/**
* Al pulsar el botón ejecutamos la funcion de espera
* @param v
*/
public void onClick_AccionTrasSegundos(View v) {
esperarYCerrar(MILISEGUNDOS_ESPERA);
}

/**
* Espera y cierra la aplicación tras los milisegundos indicados
* @param milisegundos
*/
public void esperarYCerrar(int milisegundos) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
// acciones que se ejecutan tras los milisegundos
finalizarApp();
}
}, milisegundos);
}

/**
* Finaliza la aplicación
*/
public void finalizarApp() {
finish();
}

}
[/sourcecode]

Código fuente XML (/res/layout/main.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="by TutorialAndroid.com\n\nPulsa el botón, y tras 5 segundos la aplicación se cerrará automáticamente.\n" />

<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Cerrar App tras 5 segundos"
android:onClick="onClick_AccionTrasSegundos" />

</LinearLayout>
[/sourcecode]

Descárgate el código aquí

Como programar mensajes de alerta Alert Dialog

Objetivo:

Vamos a aprender a crear de varias formas mensajes de alerta y/o confirmaciones para nuestra aplicación Android, los que son llamados AlertDialog o DialogBox, o cajas de diálogo o alerta. Los tipos que vamos a ver son Toast, DialogBuilder y AlertBox.

Para hacerlo más fácil, separamos en la medida de lo posible la interfaz gráfica (escribiendo la mayor parte de ella en el XML del layout), como viene siendo habitual en los tutoriales que se encuentran en esta web.

Vemos primero una captura de pantalla de la aplicación que vamos a programar:

Programacion Android - AlertDialog 1Programacion Android - AlertDialog 2Programacion Android - AlertDialog 3

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Programacion Android - AlertDialog 4Programacion Android - AlertDialog 5Programacion Android - AlertDialog 6

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Código fuente java (/src/Principal.java):

[sourcecode language=”java”]
package com.alertas.tutorialandroid;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class Principal extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

/**
* Funcion llamada al pulsar en el boton de Toast
* @param View v – Parametro obligado
*/
public void onClicK_Toast(View v){
mensaje("Se ha pulsado Toast");
}

/**
* Funcion llamada al pulsar en el boton de DialogBuilder
* @param View v – Parametro obligado
*/
public void onClicK_DialogBuilder(View v){
alerta("Se ha pulsado DialogBuilder");
}

/**
* Funcion llamada al pulsar en el boton de AlertBox
* @param View v – Parametro obligado
*/
public void onClicK_AlertBox(View v){
eleccion("Se ha pulsado AlertBox.\nElije opción:");
}

/**
* Mensaje en pantalla que desaparece tras un tiempo (SHORT o LONG)
* @param String cadena
*/
public void mensaje(String cadena){
Toast.makeText(this, cadena, Toast.LENGTH_SHORT).show();
}

/**
* Mensaje en pantalla que desaparece tras pulsar Atras
* @param String cadena
*/
public void alerta(String cadena) {
//se prepara la alerta creando nueva instancia
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
//seleccionamos la cadena a mostrar
dialogBuilder.setMessage(cadena);
//elegimo un titulo y configuramos para que se pueda quitar
dialogBuilder.setCancelable(true).setTitle("Titulo de la alerta");
//mostramos el dialogBuilder
dialogBuilder.create().show();
}

/**
* Mensaje en pantalla que desaparece tras pulsar alguna de sus opciones
* @param String cadena
*/
public void eleccion(String cadena){
//se prepara la alerta creando nueva instancia
AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
//seleccionamos la cadena a mostrar
alertbox.setMessage(cadena);
//elegimos un positivo SI y creamos un Listener
alertbox.setPositiveButton("Si", new DialogInterface.OnClickListener() {
//Funcion llamada cuando se pulsa el boton Si
public void onClick(DialogInterface arg0, int arg1) {
mensaje("Pulsado el botón SI");
}
});

//elegimos un positivo NO y creamos un Listener
alertbox.setNegativeButton("No", new DialogInterface.OnClickListener() {
//Funcion llamada cuando se pulsa el boton No
public void onClick(DialogInterface arg0, int arg1) {
mensaje("Pulsado el botón NO");
}
});

//mostramos el alertbox
alertbox.show();
}

}
[/sourcecode]

Código fuente XML (/res/layout/main.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Mostrar Toast"
android:onClick="onClicK_Toast"></Button>

<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Mostrar AlertBox"
android:onClick="onClicK_AlertBox"></Button>

<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Mostrar DialogBuilder"
android:onClick="onClicK_DialogBuilder"></Button>

</LinearLayout>
[/sourcecode]

Descárgate el código aquí

Como programar un Grillview

Objetivo:

Vamos a aprender a crear nuestro primer Grillview.

Requiere algo de experiencia en programación Android, ya que usaremos arrays, y varias subclases para controlar los diferentes botones que incluiremos en el Grillview.

Vemos un resultado final antes.

Ejemplo de un Grillview en Android

Código fuente java (/src/Principal.java):

[sourcecode language=”java”]
package com.grill.view;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;

public class Principal extends Activity {
public static final String[] filesnames = { "Boton 0", "Boton 1", "Boton 2", "Boton 3" };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//Asociamos el Grillview definido en nuestro XML
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ButtonAdapter(this));
}

/**
* Clase necesaria para los botones del Grillview
*/
public class ButtonAdapter extends BaseAdapter {
private Context mContext;

// Se coge el contexto, para poder usarlo luego
public ButtonAdapter(Context c) {
mContext = c;
}

// Numero de cosas que se contienen
public int getCount() {
return filesnames.length;
}

/**
*  Requerido por la estrucura
*/
public Object getItem(int position) {
return null;
}

/**
*  Requerido por la estrucura
*  @param int position
*/
public long getItemId(int position) {
return position;
}

/**
* Requerido por la estructura.
* Se define el estilo de los botones, su id y un listener
* @param int position
* @param View convertView
* @param ViewGroup parent
*/
public View getView(int position, View convertView, ViewGroup parent) {
Button btn;
if (convertView == null) {
// if it’s not recycled, initialize some attributes
btn = new Button(mContext);
//btn.setLayoutParams(new GridView.LayoutParams(100, 55));
btn.setPadding(8, 8, 8, 8);
} else {
btn = (Button) convertView;
}
// filesnames es un array con los nombres de los botones
btn.setText(filesnames[position]);
// definimos un color azul para el texto de los botones, por ejemplo
btn.setTextColor(Color.BLUE);
//podríamos definir una imagen para los botones
// btn.setBackgroundResource(R.drawable.button);
btn.setId(position);
//asociamos un listener a cada boton para recibir los clicks
btn.setOnClickListener(new MyOnClickListener(position));

return btn;
}
}

/**
* Clase listener necesaria para los clicks
*
*/
class MyOnClickListener implements OnClickListener {
private final int position;

public MyOnClickListener(int position) {
this.position = position;
}

/**
* Acciones a realizar cuando se ha pulsado
* alguno de los botones.
* Se podrían definir, por ejemplo, llamar a otras
* actividades.
*/
public void onClick(View v) {
if (this.position==0){
//acciones al pulsar el boton 1
}else if (this.position==1){
//acciones al pulsar el boton 2
}else if (this.position==2){
//acciones al pulsar el boton 2
}else if (this.position==3){
//acciones al pulsar el boton 2
}
//Log en LogCat
System.out.println("PULSADO EL "+this.position);
}
}
}
[/sourcecode]

Código fuente XML (/res/layout/main.xml):

[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />

<!–  Los botones del Grill son definidos en el codigo –>
<GridView android:id="@+id/gridview" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:numColumns="3"></GridView>

</LinearLayout>
[/sourcecode]

Descárgate el código aquí

Como quitar barra de titulo o barra de notificaciones, title bar y notification bar

Objetivo:

Vamos a aprender a quitar la barra de título (titlebar) y la barra de notificaciones (notificationbar) en nuestra aplicación Android.

La barra de título muestra el título que tiene nuestra aplicación Android según lo hayamos definido en el AndroidManifest.xml. La barra de notificaciones posee la hora, estado de la batería, conexiones a internet/gps, y las notifiaciones de calendarios, mensajes, etc:

Barras de titulo y notificaciones

Hay varias formas de hacerlo: para toda la aplicación o para cada activity. Vemos cada caso:

    1. En general (para toda la aplicación)
      Si queremos que en una sola línea de código quitemos alguna de las barras (título o notificación) para toda la aplicación, debemos añadir en el AndroidManifest.xml, dentro de la etiqueta application, el código de android:theme que se observa a continuación:
      [sourcecode language=”xml”]
      <!– Theme.NoTitlebar quita el titulo–>
      <application android:icon="@drawable/icon"
      android:label="@string/app_name"
      android:theme="@android:style/Theme.NoTitleBar">
      [/sourcecode]

      o

      [sourcecode language=”xml”]
      <!– añadiendo Fullscreen quita titulo y notificacion–>
      <application android:icon="@drawable/icon"
      android:label="@string/app_name"
      android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
      [/sourcecode]

    2. Para cada Activity en concreto
      Si lo que deseamos es quitar barras según nos convenga en cada pantalla (activity), podemos hacerlo añadiendo en el código java de cada actividad, dentro del método onCreate, lo siguiente:

      [sourcecode language=”java”]
      //Quitamos barra de titulo de la aplicacion
      this.requestWindowFeature(Window.FEATURE_NO_TITLE);
      [/sourcecode]

      o

      [sourcecode language=”java”]
      //Quitamos barra de notificaciones
      this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
      [/sourcecode]