El mensaje de error que dice:
Variable is accessed within inner class. Needs to be declared final
Es un error de Java que seguramente más de una vez ha aparecido.
En este caso vamos a ver cómo solucionar este problema al programar en Android usando Java, pero igualmente aplica a otras cosas, pues el lenguaje es Java en todos los casos.
Declara la variable como final, y ya está. Es decir, si tenías un String
definido así:
String nombre = "Luis";
Ahora defínelo así:
final String nombre = "Luis";
No vas a poder cambiar ese valor más tarde, pero sí podrás acceder a él desde clases anónimas y el problema estará resuelto.
El ejemplo de arriba funciona si no quieres cambiar el valor del objeto. En caso de que quieras cambiarlo, la solución es usar un arreglo.
Siguiendo el ejemplo anterior, ahora declara un arreglo de String
, usando final
:
final String[] nombre = {"Luis"};
Después, podrás modificar al arreglo:
nombre[0] = "Parzibyte";
Así podrías hacerlo con cualquier tipo de dato, simplemente declarando un arreglo de un elemento. También podrás acceder al mismo.
Ahora veamos otra solución, la cual es declarar la variable como una variable de instancia. En idioma español, quiere decir que declaremos las variables como miembros de la clase. Así:
public class TuClase{
String nombre = "Luis"; // Esta es una variable de instancia ;)
public void unMetodo(){
}
}
Después, dentro de cualquier método y cualquier clase anónima podrás acceder y cambiar la variable.
Hice este post después de investigar sobre las variables de instancia y todo ello, pues estaba intentando acceder a una lista de gastos de tipo List<Gasto>
, la cual estaba definida en el método onViewCreated
.
Más abajo, al agregar un ClickListener de un elemento, quería recuperar el gasto así:
Gasto gasto = gastos.get(indice);
El problema era que tenía que declarar la variable como final
, cosa que no quise hacer. Por lo tanto, saqué la variable gastos del método onViewCreated
y el problema se arregló. Es decir, la puse como miembro de la clase.
public class GastosFragment extends Fragment {
private List<Gasto> gastos; // Variable de instancia
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
GastosController gastosController = new GastosController(getActivity());
gastos = gastosController.obtenerGastos(); // Aquí definimos lo que será gastos
AdaptadorGastos adaptadorGastos = new AdaptadorGastos(gastos);
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener() {
// Esta es una "inner class"
@Override
public void onLongClick(View view, int position) {
// Y ahora sí podemos acceder a gastos ;)
Gasto gasto = gastos.get(position);
}
}));
}
}
En el ejemplo omití los import
s y algunas cosas para explicar la solución. Así es como el error que dice…
Variable is accessed within inner class. Needs to be declared final
… desaparece
Aprovechando esto, te invito a ver un CRUD de SQLite con Android.
En este post te quiero compartir mi experiencia tramitando un acta de nacimiento de México…
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
Esta web usa cookies.