Cómo agregar un enlace de vista a un proyecto de Android Gradle

La mayoría de los desarrolladores de Android probablemente estén familiarizados con el clásico findViewById() método. Páselo un ID de una de las vistas en su diseño XML y devolverá una referencia a la versión inflada de esa vista. Todo esto asumiendo que ha pasado la identificación correcta y la vista realmente existe. findViewById() no tiene una verificación incorporada para evitar que intente recuperar una vista que no puede recuperar. Ingrese Mostrar enlace.

En lugar de usar findViewById() en cada vista deseada, el enlace de vista genera automáticamente una clase de enlace para cada diseño XML. Cada vista con una ID se agrega automáticamente a la clase, por lo que puede hacer referencia a ellas directamente.

Agregar enlace de vista a un proyecto de Android Gradle es muy fácil.

Configuración de atenuación

El enlace de vista está habilitado a nivel de módulo en Gradle. Si tiene varios módulos, deberá activarlos individualmente para cada uno.

En el android bloquear en su nivel de módulo build.gradle, agregue la opción para habilitar el enlace de vista.

android {
    ...

    buildFeatures {
        viewBinding true
    }
}

Puede haber una advertencia con respecto al acceso ilegal, pero es un error y se puede ignorar con seguridad.

Sincronice el proyecto y se activará el enlace de vista. Es tan fácil.

Usando el enlace de vista

Hay varias formas de usar View Binding, pero antes de todo eso, hablemos de cómo se generan las clases de enlace.

Sintaxis del nombre de clase

Suponga que tiene un diseño XML llamado some_layout.xml. Su clase de enlace correspondiente se llamará SomeLayoutBinding. Esta plantilla es válida para todos los archivos.

Te puede interesar:  ¿El Lenovo ThinkPad T14 Gen 3 tiene Thunderbolt?

Cada palabra (separada por guiones bajos en el nombre del archivo) estará en mayúsculas y se eliminarán los guiones bajos. Luego se agrega "Binding" al final.

Crear instancias con una vista existente

Si ya ha inflado el archivo de diseño y tiene una referencia a la raíz del diseño, puede indicarle a la clase de enlace View que use el diseño existente.

Kotlin:

val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)

Java:

SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);

Por ejemplo, si quisiera usar la clase de enlace en un fragmento, se vería así.

Kotlin:

class SomeFragment : Fragment(R.layout.some_layout) {
    //Lazy initialization means bind() won't be called until "binding" is referenced.
    private val binding by lazy { SomeLayoutBinding.bind(view) }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        //Once this method is called, you can start using the binding.
    }
}

Java:

public class SomeFragment extends Fragment {
    private SomeLayoutBinding binding = null;

    public SomeFragment() {
        super(R.layout.some_layout);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
   
        //Initialize the binding.
        binding = SomeLayoutBinding.bind(view);
    }
}

Creación de instancias con una nueva vista

La clase de encuadernación también puede encargarse de inflar el diseño por usted.

Kotlin:

val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)

Java:

SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);

Este método es útil tanto en fragmentos como en actividades.

Te puede interesar:  La aplicación Google Home rediseñada incluye un flujo de configuración para la supuesta función de inicio de la tableta Pixel

A ejemplo de fragmento tendría un aspecto parecido al siguiente.

Kotlin:

class SomeFragment : Fragment() {
    private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) {
        //The "root" of the binding class is the root of its layout.
        return binding.root
    }
}

Java:

public class SomeFragment extends Fragment {
    private SomeLayoutBinding binding = null;

    @Override
    public void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Initialize the binding.
        binding = SomeLayoutBinding.inflate(inflater);
        //The "getRoot()" method of the binding class returns the root of the layout.
        return binding.getRoot();
    }
}

A Actividad de ejemplo tendría un aspecto parecido al siguiente.

Kotlin:

class SomeActivity : AppCompatActivity() {
    private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
        setContentView(binding.root)
    }
}

Java:

public class SomeActivity extends AppCompatActivity {
    private SomeLayoutBinding binding = null;

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

        //Instantiate the binding.
        binding = SomeLayoutBinding.inflate(getLayoutInflater());
        //This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
        setContentView(binding.getRoot());
    }
}

Vistas de referencia

Ahora que la clase de enlace View está configurada y lista para usar, es hora de usarla.

Te puede interesar:  Desarrollador conecta Android 12L a Raspberry Pi 4

Digamos que el contenido de some_layout.xml son algo como lo siguiente:

<LinearLayout
    android:id="@+id/root_view"
    ...>
    <FrameLayout
        android:id="@+id/some_frame_layout"
        ...
        />
    <ImageView
        android:id="@+id/some_imageview"
        ...
        />
    <LinearLayout
        android:id="@+id/inner_linear"
        ...>
        <ImageView
            android:id="@+id/inner_imageview"
            ...
            />
    </LinearLayout>
</LinearLayout>

Hay muchos identificadores a los que hacer referencia en el código. Pero siempre que haya creado una instancia de la clase vinculante, el SEO será fácil.

En Kotlin, las vistas son referenciadas por variables correspondientes a sus ID, con algunas modificaciones. Los guiones bajos se eliminan y la cadena resultante es camel. Por ejemplo, para hacer referencia some_frame_layout del código que usarías binding.someFrameLayout. el someFrameLayout La variable será una instancia de FrameLayout.

val someFrameLayout: FrameLayout = binding.someFrameLayout

En Java, las vistas son referenciadas por métodos getter correspondientes a sus identificadores, con un formato similar a Kotlin. Por ejemplo, para hacer referencia some_frame_layout, usarías binding.getSomeFrameLayout(). El método devolverá una instancia de FrameLayout.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

Las referencias de vista también se aplanan en la encuadernación. SEO inner_imageview es lo mismo que SEO some_frame_layout.

Conclusión

Como estoy seguro de que puede ver, View Binding en Android es fácil de implementar y fácil de usar. En muchos casos, es más fácil de usar que findViewById().

Para obtener más detalles sobre la implementación de View Binding, así como algunos ejemplos, consulte la documentación oficial de Google.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Usamos cookies para mejorar la experiencia del usuario. Selecciona aceptar para continuar navegando. Más información

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad