Android - Problema validando el contenido de un EditText (Solucionado + o - )

Iniciado por Aberroncho, 13 Abril 2014, 21:34 PM

0 Miembros y 1 Visitante están viendo este tema.

Aberroncho

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 (xml) [Seleccionar]

   <EditText
       android:id="@+id/campoAnno"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_alignLeft="@+id/campoPais"
       android:layout_alignTop="@+id/etiquetaAnno"
       android:ems="10"
       android:inputType="number" />


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 (java) [Seleccionar]


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_edit_travel);

EditText campoAnno = (EditText) findViewById( R.id.campoAnno );

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
else {
EditText campoCiudad = (EditText) findViewById( R.id.campoCiudad );
EditText campoComentarios = (EditText) findViewById( R.id.campoComentarios);
EditText campoPais = (EditText) findViewById( R.id.campoPais );

// Cargar el contenido de los campos
campoCiudad.setText( savedInstanceState.getCharSequence("ciudad" ) );
campoPais.setText( savedInstanceState.getCharSequence( "pais" ) );
campoAnno.setText( savedInstanceState.getCharSequence( "anno" ) );
campoComentarios.setText( savedInstanceState.getCharSequence( "comentarios" ) );
}

campoAnno.setOnFocusChangeListener( new OnFocusChangeListener() {

@Override
public void onFocusChange(View v, boolean hasFocus) {

if ( !hasFocus ) {
int valor = Integer.parseInt( v.toString() );

if ( valor < 1950 || valor > 2014 ) {
Toast.makeText( getApplicationContext()
     , getString( R.string.anno_fuera_rango )
     , Toast.LENGTH_SHORT ).show();
}
}
}
});
}


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


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.
"La ignorancia es la noche de la mente, pero una noche sin Luna ni estrellas."
(Confucio)

Aberroncho

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.
"La ignorancia es la noche de la mente, pero una noche sin Luna ni estrellas."
(Confucio)