Tengo un problema que no puedo replicar. Estoy utilizando un ViewPager para mostrar un formulario con varios tabs, cada tab es un fragment. El usuario completa cada uno de los tabs y presiona un botón "Enviar". En ese momento se recorre cada uno de los fragments para validar los datos de la siguiente manera:
private boolean validarFormularios() {
boolean errores = false;
for (int i = 0; i < adapter.getCount(); i++) {
Fragment fragment = adapter.getItem(i);
int canterror = 0;
if (fragment instanceof FragmentForm) {
canterror = ((FragmentForm) fragment).validarFormulario();
if (canterror > 0) errores = true;
}
setBadgeTab(canterror, i);
}
return errores;
}
Y dentro de cada fragment valida algo como lo siguiente:
if (tvCalle.length() == 0) {
validado++;
tilCalle.setError(getResources().getString(R.string.error_campo_ob));
} else {
if (tvCalle.length() > tilCalle.getCounterMaxLength()) {
validado++;
tilCalle.setError(getResources().getString(R.string.error_campo_excede));
} else {
tilCalle.setError(null);
}
}
return validado;
Todo esto funciona correctamente cada vez que lo pruebo. Sin embargo, estoy utilizando Firebase y por medio de la herramienta Crashlytics puedo ver que ocacionalmente hay usuarios que les genera un NullpointerException la línea mencionada anteriormente:
if (tvCalle.length() == 0)
El error que recibo es el siguiente:
> Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.TextView.length()' on a null object reference
at com.edensa.wem.fragment.pnt.InfoSumFragment.validarCalle(InfoSumFragment.java:200)
at com.edensa.wem.fragment.pnt.InfoSumFragment.validarFormulario(InfoSumFragment.java:176)
at com.edensa.wem.activity.FormActivity.validarFormularios(FormActivity.java:262)
tvCalle es inicializado desde el onCreateView de uno de los fragments de la siguiente manera:
TextView tvCalle;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.fragment_info_sum, container, false);
tvCalle = rootview.findViewById(R.id.tvNombre);
}
Como dije, siempre que lo pruebo funciona bien, pero hay una situación que no puedo replicar en la que sale por nullpointer.
Cabe destacar que es una aplicación productiva que la usan no menos de 100 personas durante todo el día. La gran mayoría de las veces no tienen problemas, sin embargo unas 20 0 30 veces al día recibo el error planteado anteriormente. Con esto quiero decir que no hay un error lógico en el código. Sospecho que ante un determinado evento que no puedo deducir, el objeto pierde su valor o se realiza un "detach" del fragment.
Si me pueden ayudar con este problema, se los voy a agradecer.
Saludos.