Android - calcular edad

 
Vista:
Imágen de perfil de Charly
Val: 123
Bronce
Ha aumentado su posición en 2 puestos en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por Charly (69 intervenciones) el 12/03/2017 20:49:06
Hola, estoy creando una aplicación sencillita para calcular la edad real y la edad mental (de broma) de una persona.
Me inicia bien el programa, pero a la hora de darle al botón de aceptar y tener que hacer los cálculos se detiene el programa.
Hace un tiempo hice esto mismo en Java y me funcionó y ahora lo he modificado para android, pero no se qué he hecho mal.
Este es el código xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?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"
    tools:context="charly.android.pc.tu_edad.TuedadActivity">
    <TextView android:text="Nombre:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtNombre"
        android:inputType="textCapSentences"/>
    <TextView android:text="Fecha de nacimiento(dd/mm/aaaa):"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtFecha"
        android:inputType="textCapSentences"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Aceptar"
            android:onClick="btnAceptar"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Cancelar"
            android:onClick="btnCancelar"/>
    </LinearLayout>
</LinearLayout>
Y este el del java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package charly.android.pc.tu_edad;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class TuedadActivity extends AppCompatActivity{
    EditText txtNombre;
    EditText txtFecha;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tuedad);
        txtNombre=(EditText)findViewById(R.id.txtNombre);
        txtFecha=(EditText)findViewById(R.id.txtFecha);
    }
    public int edadReal(){
        String [] fecha_nacimiento=txtFecha.toString().split("/");
        int dia=Integer.parseInt(fecha_nacimiento[0]);
        int mes=Integer.parseInt(fecha_nacimiento[1]);
        int año=Integer.parseInt(fecha_nacimiento[2]);
        Calendar edad=new GregorianCalendar(año,mes,dia);
        Calendar hoy=Calendar.getInstance();
        int años=hoy.get(Calendar.YEAR)-edad.get(Calendar.YEAR);
        edad.add(Calendar.YEAR,años);
        if(hoy.before(edad)){
            años--;
        }
        return años;
    }
    public int edadMental(int años){
        if(txtNombre.getText().equals("carlos")){
            años=años+2;
        }else if(txtNombre.equals("alejandro")){
            años=años-3;
        }else if(txtNombre.equals("raquel")){
            años=años-9;
        }else{
            años=años+0;
        }
        return años;
    }
    public void btnAceptar(View view,int años){
        Toast.makeText(this,txtNombre.getText().toString()+" tu edad REAL es de "+edadReal()+ " años. Y tu edad MENTAL es de "+edadMental(años)+" años.",Toast.LENGTH_LONG).show();
    }
    public void btnCancelar(View view){
        Toast.makeText(this,"ADIOS!",Toast.LENGTH_LONG).show();
        System.exit(0);
    }
}
No se si estan mal las operaciones o el toast.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por juanki (253 intervenciones) el 12/03/2017 21:06:56
Hola

El error, el primer paso es averiguar cual es el error, eso es básico en programación.

Con Android es muy fácil, ejecuta el programa en el móvil desde AndroidStudio y en el log te dirá el error y la línea en la que ocurrió.

Una vez sepas lo que falla, podrás solucionarlo.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Charly
Val: 123
Bronce
Ha aumentado su posición en 2 puestos en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por Charly (69 intervenciones) el 12/03/2017 21:12:28
Hola. Gracias Juanki. Si tenías razón.
No me pone la línea del error, pero me dice lo siguiente:
java.lang.IllegalStateException: Could not find method btnAceptar(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:327)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
at android.view.View.performClick(View.java:4101)
at android.view.View$PerformClick.run(View.java:17082)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4940)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)

A qué se puede deber este error?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por juanki (253 intervenciones) el 13/03/2017 18:46:46
Hola

El error lo tienes con el método btnAceptar, lo has declarado bien en el archivo XML, pero luego, cuando lo has hecho en el archivo java no lo has hecho bien,ese método tienes que declararlo como public void y recibir unparámetro de tipo View y tú lo has declarado además con un parámetro de tipo int, por eso no te funciona.

Esa variable año declárala como como variable de clase y no tienes que ir pasándola como parámetro. Ah, y no uses ñ ni en la variables ni métodos.

@santiago, declarando en el XML el onClick no hace falta obtener la referencia para controlar el click del botón.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de santiago
Val: 24
Ha aumentado su posición en 2 puestos en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por santiago (3 intervenciones) el 13/03/2017 12:03:56
Te falta declarar los botones y hacer el casting de ellos
Button btnAceptar;

btnAceptar= (Button) findViewById(R.Id.Aceptar);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Charly
Val: 123
Bronce
Ha aumentado su posición en 2 puestos en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por Charly (69 intervenciones) el 13/03/2017 19:44:40
He hecho esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package charly.android.pc.tu_edad;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class TuedadActivity extends AppCompatActivity{
    EditText txtNombre;
    EditText txtFecha;
    Button btnAceptar;
    Button btnCancelar;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tuedad);
        txtNombre=(EditText)findViewById(R.id.txtNombre);
        txtFecha=(EditText)findViewById(R.id.txtFecha);
        btnAceptar=(Button)findViewById(R.id.btnAceptar);
        btnCancelar=(Button)findViewById(R.id.btnCancelar);
    }
    public int edadReal(){
        String [] fecha_nacimiento=txtFecha.toString().split("/");
        int dia=Integer.parseInt(fecha_nacimiento[0]);
        int mes=Integer.parseInt(fecha_nacimiento[1]);
        int anio=Integer.parseInt(fecha_nacimiento[2]);
        Calendar edad=new GregorianCalendar(anio,mes,dia);
        Calendar hoy=Calendar.getInstance();
        int anios=hoy.get(Calendar.YEAR)-edad.get(Calendar.YEAR);
        edad.add(Calendar.YEAR,anios);
        if(hoy.before(edad)){
            anios--;
        }
        return anios;
    }
    public int edadMental(){
        int aniosa=0;
        if(txtNombre.getText().equals("carlos")){
            aniosa=edadReal()+2;
        }else if(txtNombre.equals("alejandro")){
            aniosa=edadReal()-3;
        }else if(txtNombre.equals("raquel")){
            aniosa=edadReal()-9;
        }else{
            aniosa=edadReal()+0;
        }
        return aniosa;
    }
    public void btnAceptar(View view){
        Toast.makeText(this,txtNombre.getText().toString()+" tu edad REAL es de "+edadReal()+ " años. Y tu edad MENTAL es de "+edadMental()+" años.",Toast.LENGTH_LONG).show();
    }
    public void btnCancelar(View view){
        Toast.makeText(this,"ADIOS!",Toast.LENGTH_LONG).show();
        System.exit(0);
    }
}

Y me aparece este error:

java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
at android.view.View.performClick(View.java:4101)
at android.view.View$PerformClick.run(View.java:17082)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4940)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:4101) 
at android.view.View$PerformClick.run(View.java:17082) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4940) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NumberFormatException: Invalid int: "android.support.v7.widget.AppCompatEditText@420c5c40"
at java.lang.Integer.invalidInt(Integer.java:138)
at java.lang.Integer.parse(Integer.java:375)
at java.lang.Integer.parseInt(Integer.java:366)
at java.lang.Integer.parseInt(Integer.java:332)
at charly.android.pc.tu_edad.TuedadActivity.edadReal(TuedadActivity.java:29)
at charly.android.pc.tu_edad.TuedadActivity.btnAceptar(TuedadActivity.java:55)
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
at android.view.View.performClick(View.java:4101) 
at android.view.View$PerformClick.run(View.java:17082) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4940) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
at dalvik.system.NativeStart.main(Native Method)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco
Val: 466
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por Francisco (358 intervenciones) el 13/03/2017 21:32:53
Parece que tienes un error en la fecha no te devuelve ese metodo una fecha real por eso te salta error



prueba con esto para averiguar la fecha según el textview;


Cuidado si la fecha no la pones en el formato correcto de dará error

Suerte.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public int edadReal(){
 
    String strfecha=txtFecha.getText().toString();
 
    java.util.Date fechadate = null;
 
    SimpleDateFormat formatoTexto = new SimpleDateFormat("dd/MM/yyyy");
 
 
	try {
		fechadate = formatoTexto.parse(strfecha);
	} catch (java.text.ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
 
   Calendar edad=Calendar.getInstance();
   edad.setTime(fechadate);
 
   Calendar hoy=Calendar.getInstance();
   int años=hoy.get(Calendar.YEAR)-edad.get(Calendar.YEAR);
   edad.add(Calendar.YEAR,años);
   if(hoy.before(edad)){
       años--;
   }
    return años;
}

Comenta si te ha servido de algo.

Ssludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de santiago
Val: 24
Ha aumentado su posición en 2 puestos en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por santiago (3 intervenciones) el 13/03/2017 23:34:28
Implementa el "implements
OnClickListener" en tu clase principal (class TuedadActivity)
Al parecer tienes problema con el reconocimiento del evento onclick
Despues de el extends AppCompActivity coloca: implements implements
OnClickListener y para que trabaje con el evento
Coloca para cada boton :
btnAceptar.setOnClickListener(this);
Luego
Lo trabajas en su evento cada funcion de los botonesOverride
public void onClick (View v)
{
//Puedes utilizar un switch/ case para cada caso de los eventos de los botones
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Charly
Val: 123
Bronce
Ha aumentado su posición en 2 puestos en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por Charly (69 intervenciones) el 14/03/2017 21:31:08
Francisco, muchas gracias.
El método que tenía para calcular la edad real no funcionaba.
Santiago, no necesitaba implementar el método onClick para los botones.
Ahora el problema es que la edad mental me aparece la misma que la real, es decir, que el método edadMental no funciona.
¿Puede que sea por llamar al método edadReal y sumarle o restarle un número?
Por cierto, ¿hay alguna manera de que el toast dure más tiempo en pantalla?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco
Val: 466
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

calcular edad

Publicado por Francisco (358 intervenciones) el 15/03/2017 14:59:25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public int edadReal(){
 
 
	  String strfecha=txtFecha.getText().toString();
 
      java.util.Date fechadate = null;
 
      SimpleDateFormat formatoTexto = new SimpleDateFormat("dd/MM/yyyy");
 
 
	    try {
			fechadate = formatoTexto.parse(strfecha);
		} catch (java.text.ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
 
       Calendar edad=Calendar.getInstance();
       edad.setTime(fechadate);
 
       Calendar hoy=Calendar.getInstance();
       int años=hoy.get(Calendar.YEAR)-edad.get(Calendar.YEAR);
 
       // no se que quieres conseguir con esto
 
       // suprimelo y te devolverá la edad real.
 
 
//       edad.add(Calendar.YEAR,años);
//       if(hoy.before(edad)){
//           años--;
//       }
        return años;
    }


En cuanto el toast quitalo y puedes poner un textView que actualice la solución




lo que te Fallaba de la fecha era porque te faltaba recoger el valor con gettext();

1
2
String [] fecha_nacimiento=txtFecha.toString().split("/");
String [] fecha_nacimiento=( txtFecha.getText().toString().split("/"));

y quedaria asi y si que funciona.

1
2
3
4
String [] fecha_nacimiento=( txtFecha.getText().toString().split("/"));
int dia=Integer.parseInt(fecha_nacimiento[0]);
int mes=Integer.parseInt(fecha_nacimiento[1]);
int año=Integer.parseInt(fecha_nacimiento[2]);

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar