Solución:
Hay un par de cosas que debe hacer y trato de organizarlas y enumerarlas: (Según los documentos de los desarrolladores de Android de este enlace y mis experiencias personales)
-
Necesitas usar Android Studio 3.6 canary11 + (actualmente estoy usando Android Studio 4 y me está haciendo bien el trabajo)
Puede encontrarlo desde aquí: https://developer.android.com/studio/archive
-
Necesita actualizar su contenedor de Gradle a Gradle “5.6.4” y la herramienta de compilación de Gradle a “3.6.0-rc01”, las versiones superiores también funcionan, así que no tenga miedo de ser actualizado.
distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip
dependencies {
...
classpath 'com.android.tools.build:gradle:3.6.0-rc01'
}
- Para habilitar el enlace de vista en un módulo, agregue el elemento viewBinding a su archivo build.gradle, como se muestra en el siguiente ejemplo:
android {
...
buildFeatures {
viewBinding true
}
}
- Si desea que se ignore un archivo de diseño al generar clases de enlace, agregue el
tools:viewBindingIgnore="true"
atributo a la vista raíz de ese archivo de diseño:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
-
Si el enlace de vista está habilitado para un módulo, se genera una clase de enlace para cada archivo de diseño XML que contiene el módulo. Cada clase de enlace contiene referencias a la vista raíz y todas las vistas que tienen un ID. El nombre de la clase de enlace se genera convirtiendo el nombre del archivo XML a caja camel y agregando la palabra “Binding” al final.
Por ejemplo, dado un archivo de diseño llamado
result_profile.xml
:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
La clase de enlace generada se llama ResultProfileBinding
. Esta clase tiene dos campos: a TextView
llamado name
y un Button
llamado button
. los ImageView
en el diseño no tiene ID, por lo que no hay referencia a él en la clase de enlace.
Cada clase de enlace también incluye un getRoot()
método, proporcionando una referencia directa para la vista raíz del archivo de diseño correspondiente. En este ejemplo, el getRoot()
método en el ResultProfileBinding
clase devuelve el LinearLayout
vista raíz.
- Para configurar una instancia de la clase de enlace para su uso con una actividad, fragmento o adaptador de vista de tarjeta, realice los siguientes pasos:
- en el método onCreate () de la actividad:
private ResultProfileBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ResultProfileBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
}
- en el método onCreateView () de los fragmentos:
private FragmentHousesBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
binding = FragmentHousesBinding.inflate(inflater, container, false);
init();
return binding.getRoot();
}
- en el método onCreateViewHolder () del adaptador de vista de tarjeta:
HouseCardPropertyFragmnetBinding binding;
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
binding = HouseCardPropertyFragmnetBinding.inflate(LayoutInflater
.from(parent.getContext()), parent, false);
return new Holder(binding);
}
@Override
public void onBindViewHolder(@NonNull HouseAdapter.Holder holder, int position) {
holder.bindData(getItem(position));
}
class Holder extends RecyclerView.ViewHolder {
HouseCardPropertyFragmnetBinding view;
Holder(@NonNull HouseCardPropertyFragmnetBinding v) {
super(v.getRoot());
view = v;
}
void bindData(Tag item) {
view.tagTxt.setText(item.Name);
}
}
eso es todo, estás libre de la findViewById
de aquí en adelante 😉
ViewBinding solo está disponible desde Android Studio 3.6 y superior
1: – Necesita actualizar su herramienta de construcción de Gradle a 3.6.1 en build.gradle (nivel de proyecto)
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
}
2: – Necesita habilitar viewBinding en build.gradle (aplicación)
android {
viewBinding {
enabled = true
}}
Una vez que se habilita el enlace de vista, se genera una clase de enlace para cada diseño XML. El nombre de la clase de enlace se genera convirtiendo el nombre del archivo XML a caja camel y agregando la palabra “Binding” al final.
Ejemplo: – si un archivo de diseño se denomina “add_item_activity.xml“entonces la clase Name of Binding será”AddItemActivityBinding“
3: -Para configurar una instancia de la clase de enlace para su uso con una actividad, cree una instancia de la clase de enlace, aquí crearemos una instancia de “AddItemActivityBinding“y llamará a la estática inflar método generado en la clase de enlace
Obtenga una referencia a la vista raíz llamando al método getRoot () y pase esta vista raíz en el método setContentView ()
public class AddItemActivity extends AppCompatActivity {
private AddItemActivityBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = AddItemActivityBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
//now we can access views by their IDs
binding.tvTitleMyOrder.setText("Title goes here");
}
}
Ahora podemos acceder a las vistas por sus ID utilizando la instancia de la clase de enlace