En ese tutorial vamos a explicar como crear una aplicación que calculará los días fértiles de la mujer además de guardarlo en un fichero en memoria externa.
La aplicación pedirá la fecha de la última regla y la duración media del ciclo de la mujer y a partir de esos datos se calculará el periodo fértil.
En esta aplicación aprenderás a:
- Usar un componente datePicker
- Escribir en un fichero situado en memoria externa
Enlaces de interés:
Puede descargar si lo desea el código fuente de este proyecto.
Aquí podrás ir a la ayuda oficial de Android donde te explica detalladamente el uso de un DatePicker
Pasos a seguir:
1. Crear la actividad principal en la que el usuario tendrá que elegir la fecha e introducir la duración media del ciclo.
Los componentes principales serán:
- datePicker para la introducción de la fecha
- EditText: para la introducción de la duración media del ciclo
- Button: para calcular la duración media
Un ejemplo de interfaz sería:
<RelativeLayout 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" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/fechaDeLaUltimaRegla" android:textAppearance="?android:attr/textAppearanceMedium" /> <DatePicker android:id="@+id/datePicker" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginBottom="84dp" > <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20dp" android:paddingRight="15dp" android:text="@string/duracionMediaDelCiclo" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/edTextDuracionCiclo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="number" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/dias" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> <Button android:id="@+id/btnCalcular" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:text="@string/calcular" /> </RelativeLayout>
2. A continuación creamos una segunda actividad para mostrar los datos obtenidos.
Los componentes principales serán:
Los componentes principales serán:
- TextView: para mostrar la información
- Button: para retroceder a la actividad prinicpal
Aquí le pongo un ejemplo para esta interfaz.
<RelativeLayout 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" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:orientation="horizontal" > <TextView android:id="@+id/textVInicio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:text="@string/hasta" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/textVFin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <Button android:id="@+id/btnAtras" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:text="@string/atras" /> </RelativeLayout>
3. Se declaran los campos a utilizar para la primera actividad.
public class PeriodoFertilActivity extends Activity { //1. Campos protected DatePicker datePicker; protected EditText duracionCiclo; protected Button calcular; public Calendar diaMasFertil; //Alamcena el día más fértil
4. Inicializamos los campos además de definir los eventos en el método onCreate.
5. Creamos el método que lee le fecha introducida por el usuario.
6. Creamos un método para escribir con un formato apropiado las fechas que obtengamos.
7. Creamos un método para calcular el día más fértil.
8. Finalmente para terminar con esta clase calculamos el periodo fértil y se lo enviamos a la segunda actividad para que lo muestre mediante el siguiente método.
9. Una vez definida la clase de la actividad principal, definimos la clase de la segunda actividad, para ello como siempre, definimos los campos que vamos a utilizar en la clase.
10. Seguidamente inicializamos los campos y los eventos que vamos a utilizar en el método onCreate().
11. Finalmente creamos el método que guardará el periodo fértil en un fichero en memoria externa.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_periodo_fertil); //2. Unir los elementos de la interfaz con los campos datePicker = (DatePicker) findViewById(R.id.datePicker); duracionCiclo = (EditText) findViewById(R.id.edTextDuracionCiclo); calcular = (Button) findViewById(R.id.btnCalcular); // (Button calcular) Evento OnClickListener calcular.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub diaMasFertil = calcularDiaMasFertil(leerFecha(), Integer.parseInt(duracionCiclo.getText().toString())); calcularPeriodoFertil(diaMasFertil); } }); }
5. Creamos el método que lee le fecha introducida por el usuario.
/** * Lee la fecha de un DatePicker * @return Un Calendar con la fecha */ public Calendar leerFecha(){ Calendar calendario = Calendar.getInstance(); calendario.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth()); return calendario; }
6. Creamos un método para escribir con un formato apropiado las fechas que obtengamos.
/** * Escribe la fecha obtenida de un Calendar * @param calendario Calendar el cual contiene una fecha * @return La fecha escrita */ public String escribirFecha(Calendar calendario){ SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); //Aplicamos un formato return dateFormat.format(calendario.getTime()); }
7. Creamos un método para calcular el día más fértil.
/** * Calcula el día más fértil * @param fechaUltimaRegla La fecha de la última regla * @param duracionCiclo Duración del ciclo de ovulación * @return */ public Calendar calcularDiaMasFertil(Calendar fechaUltimaRegla, int duracionCiclo){ fechaUltimaRegla.add(Calendar.DAY_OF_MONTH, duracionCiclo/2); //Calcula el día más fertil return fechaUltimaRegla; }
8. Finalmente para terminar con esta clase calculamos el periodo fértil y se lo enviamos a la segunda actividad para que lo muestre mediante el siguiente método.
/** * Calcula el periodo fértil y lo muestra por pantalla * @param diaMasFertil El día más fértil */ public void calcularPeriodoFertil(Calendar diaMasFertil){ //Campos Intent intent; Bundle bundle; String inicioFertil; String finalFertil; //Calcula el inicio del periodo fertil diaMasFertil.add(Calendar.DAY_OF_MONTH, -3); inicioFertil = escribirFecha(diaMasFertil); //Calcula el final del periodo fertil diaMasFertil.add(Calendar.DAY_OF_MONTH, 3); finalFertil = escribirFecha(diaMasFertil); //Envia los datos a la otra actividad intent = new Intent(PeriodoFertilActivity.this, DuracionCicloActivity.class); bundle = new Bundle(); bundle.putString("INICIOFERTIL", inicioFertil); bundle.putString("FINALFERTIL", finalFertil); intent.putExtras(bundle); startActivity(intent); //Inicia la otra actividad }
9. Una vez definida la clase de la actividad principal, definimos la clase de la segunda actividad, para ello como siempre, definimos los campos que vamos a utilizar en la clase.
public class DuracionCicloActivity extends Activity { //1. Campos protected TextView inicio; protected TextView fin; protected Button atras;
10. Seguidamente inicializamos los campos y los eventos que vamos a utilizar en el método onCreate().
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_duracion_ciclo); //2. Une los elementos de la interfaz con la clase inicio = (TextView) findViewById(R.id.textVInicio); fin = (TextView) findViewById(R.id.textVFin); atras = (Button) findViewById(R.id.btnAtras); //3. Recuperar la información Bundle bundle = this.getIntent().getExtras(); //4. Muestra la información inicio.setText(bundle.getString("INICIOFERTIL")); fin.setText(bundle.getString("FINALFERTIL")); //4. Escribe la información en el fichero escribirFichero(inicio.getText().toString(), fin.getText().toString()); // (Button Atras) Evento OnClickListener atras.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent (DuracionCicloActivity.this, PeriodoFertilActivity.class); startActivity(intent); } }); }
11. Finalmente creamos el método que guardará el periodo fértil en un fichero en memoria externa.
/** * Guarda dos lineas separadas por coma en un fichero * @param linea1 * @param linea2 */ public void escribirFichero(String linea1, String linea2){ try { OutputStreamWriter fout= new OutputStreamWriter( openFileOutput("periodoFertil.txt", Context.MODE_PRIVATE)); fout.write("Periodo fértil desde el "+linea1+" hasta "+linea2); fout.close(); } catch (Exception ex) { Log.e("Ficheros", "Error al escribir fichero a memoria interna"); } } }
FIN
No hay comentarios:
Publicar un comentario