elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Android - Problema validando el contenido de un EditText (Solucionado + o - )
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Android - Problema validando el contenido de un EditText (Solucionado + o - )  (Leído 5,803 veces)
Aberroncho
Colaborador
***
Desconectado Desconectado

Mensajes: 1.738


Daría todo lo que sé por la mitad de lo que ignoro


Ver Perfil
Android - Problema validando el contenido de un EditText (Solucionado + o - )
« en: 13 Abril 2014, 21:34 pm »

Estoy haciendo una pequeña activity en la que he puesto un EditText para introducir un año. Quiero validar que el número que se introduce esté entre 1950 y 2014.

El campo lo he definido de la siguente manera en el layaout.xml

Código
  1.    <EditText
  2.        android:id="@+id/campoAnno"
  3.        android:layout_width="fill_parent"
  4.        android:layout_height="wrap_content"
  5.        android:layout_alignLeft="@+id/campoPais"
  6.        android:layout_alignTop="@+id/etiquetaAnno"
  7.        android:ems="10"
  8.        android:inputType="number" />
  9.  

En el evento onCreate de la activity estoy intentando añadirle al campo un evento que haga la validación del rango. He probado añadiendo al campo un evento onFocusChangeListener. He probado a añadirle un TextWatcher. Y he probado a añadirle un InputFilter.

En los tres casos obtengo un error java.lang.NullPointerException en el momento de ejecutarse el método onCreate de la activity y no soy capaz de ver que es lo que hago mal.

Este el el método onCreate con el código que he puesto para añadir el onFocusChangeListener (Funciona perfectamente si le quito el código de añadir el onFocusChangeListener):

Código
  1.  
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5.  
  6. setContentView(R.layout.activity_edit_travel);
  7.  
  8. EditText campoAnno = (EditText) findViewById( R.id.campoAnno );
  9.  
  10. if (savedInstanceState == null) {
  11. getSupportFragmentManager().beginTransaction()
  12. .add(R.id.container, new PlaceholderFragment()).commit();
  13. }
  14. else {
  15. EditText campoCiudad = (EditText) findViewById( R.id.campoCiudad );
  16. EditText campoComentarios = (EditText) findViewById( R.id.campoComentarios);
  17. EditText campoPais = (EditText) findViewById( R.id.campoPais );
  18.  
  19. // Cargar el contenido de los campos
  20. campoCiudad.setText( savedInstanceState.getCharSequence("ciudad" ) );
  21. campoPais.setText( savedInstanceState.getCharSequence( "pais" ) );
  22. campoAnno.setText( savedInstanceState.getCharSequence( "anno" ) );
  23. campoComentarios.setText( savedInstanceState.getCharSequence( "comentarios" ) );
  24. }
  25.  
  26. campoAnno.setOnFocusChangeListener( new OnFocusChangeListener() {
  27.  
  28. @Override
  29. public void onFocusChange(View v, boolean hasFocus) {
  30.  
  31. if ( !hasFocus ) {
  32. int valor = Integer.parseInt( v.toString() );
  33.  
  34. if ( valor < 1950 || valor > 2014 ) {
  35. Toast.makeText( getApplicationContext()
  36.      , getString( R.string.anno_fuera_rango )
  37.      , Toast.LENGTH_SHORT ).show();
  38. }
  39. }
  40. }
  41. });
  42. }
  43.  

Y esto es lo que me sale en la consola de log al ejecutarse:

Código:
04-13 15:18:26.958: E/AndroidRuntime(1179): FATAL EXCEPTION: main
04-13 15:18:26.958: E/AndroidRuntime(1179): Process: com.example.uax_ef_03_01_edit_travel_activity, PID: 1179
04-13 15:18:26.958: E/AndroidRuntime(1179): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.uax_ef_03_01_edit_travel_activity/com.example.uax_ef_03_01_edit_travel_activity.EditTravelActivity}: java.lang.NullPointerException
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.ActivityThread.access$800(ActivityThread.java:135)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.os.Handler.dispatchMessage(Handler.java:102)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.os.Looper.loop(Looper.java:136)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.ActivityThread.main(ActivityThread.java:5017)
04-13 15:18:26.958: E/AndroidRuntime(1179): at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:18:26.958: E/AndroidRuntime(1179): at java.lang.reflect.Method.invoke(Method.java:515)
04-13 15:18:26.958: E/AndroidRuntime(1179): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-13 15:18:26.958: E/AndroidRuntime(1179): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-13 15:18:26.958: E/AndroidRuntime(1179): at dalvik.system.NativeStart.main(Native Method)
04-13 15:18:26.958: E/AndroidRuntime(1179): Caused by: java.lang.NullPointerException
04-13 15:18:26.958: E/AndroidRuntime(1179): at com.example.uax_ef_03_01_edit_travel_activity.EditTravelActivity.onCreate(EditTravelActivity.java:41)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.Activity.performCreate(Activity.java:5231)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-13 15:18:26.958: E/AndroidRuntime(1179): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
04-13 15:18:26.958: E/AndroidRuntime(1179): ... 11 more


¿Alguien puede decirme que hago mal?  :(

Por cierto: estoy compilando con el API19 y compatibilidad desde el API8


Muchas gracias.


« Última modificación: 14 Abril 2014, 23:55 pm por Aberroncho » En línea

"La ignorancia es la noche de la mente, pero una noche sin Luna ni estrellas."
(Confucio)
Aberroncho
Colaborador
***
Desconectado Desconectado

Mensajes: 1.738


Daría todo lo que sé por la mitad de lo que ignoro


Ver Perfil
Re: Android - Problema validando el contenido de un EditText
« Respuesta #1 en: 14 Abril 2014, 23:54 pm »

Ya he descubierto el problema.

El proyecto, tal como lo crea por defecto el Eclipse-ADT, tiene un layaout principal llamado activity_edit_travel que es al que se llama en la línea 6 con la función setContentView y sobre este se sitúa un un segundo layaout llamado fragment_edit_travel.

Los campos los puse sobre el segundo layout, fragment_edit_travel. Este segundo layout se despliega en la línea 11 con la llamada al getSupportFragmentManager().

El problema es que en el método onCreate los campos del segundo layout no son accesibles. Cuando intentas referenciarlos con "R.id.campo", la referencia es nula.

Al final la solución ha sido añadir el onFocusChangeListener() del campo desde el constructor de la clase PlaceholderFragment que se emplea en las líneas 11 y 12 para desplegar el segundo layout.

Soy nuevo en esto así que no sé como de "limpia" será la solución pero funciona.

¿Alguien sabría decirme como referenciar los campos del segundo layout directamente en el onCreate de la activity?

Muchas gracias.
Salu2.


En línea

"La ignorancia es la noche de la mente, pero una noche sin Luna ni estrellas."
(Confucio)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines