Ariel Costas

Deja de usar findViewById en Android

Si desarrollas Android y no te has pasado a Jetpack Compose (o ni siquiera a Kotlin, y sigues en Java), probablemente tienes en tu código uno o más findViewById(R.id.algo). Esta es la forma por defecto de obtener una vista XML en código (para añadir eventos, por ejemplo); pero es muy engorrosa cuando tienes varios elementos.

Por esto, podemos usar "View Binding" para obtener vistas desde código. De esta forma, en lugar de hacer uno o varios findViewById con sus respectivas propiedades Java; solo tendremos una propiedad (o incluso variable en onCreate para acceder a toda la vista).

Para utilizar esto, hay que seguir los siguientes pasos:

  1. Activarlo en Gradle.

En el build.gradle del módulo (dentro de app), añadimos el siguiente ajuste:

android {
    namespace ...
    compileSdk 33
    ...
    viewBinding {
        enabled = true
    }
}

Solo hay que copiar lo de viewBinding, lo demás está como referencia de dónde se debe colocar. Una vez añadido, resincronizamos Gradle en Android Studio.

  1. Usarlo en la actividad.

Pongamos que tenemos una MainActivity que carga un layout activity_main.xml. Nuestra clase de binding (creada por Android) se llamará ActivityMainBinding (es decir, como el XML pero con UpperCamelCase y "Binding" al final).

En la actividad, en el onCreate, tendremos que usar el siguiente código:

public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;

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

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
    }
}

Como podemos ver, el setContentView carga la vista desde el binding, y no desde el recurso R.layout.activity_main.

  1. A disfrutarlo

Pongamos que tenemos un TextView con el ID miTv. Podemos modificar el contenido con:

binding.miTv.setText("Hola");

El binding.miTv es de tipo TextView, con los mismos métodos que tendría TextView con el findViewById.

Thoughts? Leave a comment