Liaison de vue Inclus dans Android Jetpack.

La liaison de vue est une fonctionnalit� qui facilite l'�criture de code qui interagit avec des vues. Une fois la liaison de vue activ�e dans un module, elle g�n�re une liaison pour chaque fichier de mise en page XML pr�sent dans ce module. Instance d'une liaison contient des r�f�rences directes � toutes les vues ayant un identifiant dans la mise en page correspondante.

Dans la plupart des cas, la liaison de vue remplace findViewById.

Configuration

La liaison de vue est activ�e module par module. Pour activer la liaison de vue dans un , d�finissez l'option de compilation viewBinding sur true au niveau du module. build.gradle, comme illustr� dans l'exemple suivant:

Groovy

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

Kotlin

android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

Si vous souhaitez qu'un fichier de mise en page soit ignor� lors de la g�n�ration de classes de liaison, ajoutez L'attribut tools:viewBindingIgnore="true" � la vue racine de cette mise en page :

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

Utilisation

Si la liaison de vue est activ�e pour un module, une classe de liaison est g�n�r�e pour chaque Fichier de mise en page XML que contient le module. Chaque classe de liaison contient des r�f�rences � la vue racine et � toutes les vues ayant un ID. Le nom de la classe de liaison est g�n�r� en convertissant le nom du fichier XML en casse Pascal et en ajoutant le le mot "Liaison" jusqu'� la fin.

Prenons l'exemple d'un fichier de mise en page nomm� result_profile.xml qui contient les �l�ments suivants:

<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>

La classe de liaison g�n�r�e est appel�e ResultProfileBinding. Cette classe comporte deux : une TextView appel�e name et une Button appel�e button. La ImageView dans la mise en page n'a pas d'ID. Il n'y a donc aucune r�f�rence � cette propri�t� dans le classe de liaison.

Chaque classe de liaison inclut �galement une m�thode getRoot(), fournissant ainsi une liaison directe pour la vue racine du fichier de mise en page correspondant. Dans cet exemple, La m�thode getRoot() de la classe ResultProfileBinding renvoie Vue racine LinearLayout.

Les sections suivantes illustrent l'utilisation des classes de liaison g�n�r�es dans les activit�s et les fragments.

Utiliser la liaison de vue dans les activit�s

Pour configurer une instance de la classe de liaison afin de l'utiliser avec une activit�, ex�cutez la les �tapes suivantes dans les M�thode onCreate():

  1. Appelez la m�thode statique inflate() incluse dans la classe de liaison g�n�r�e. Cela cr�e une instance de la classe de liaison que l'activit� doit utiliser.
  2. Obtenez une r�f�rence � la vue racine en appelant la m�thode getRoot() ou � l'aide d'une propri�t� Kotlin syntaxe.
  3. Transmettez la vue racine � setContentView() pour en faire l'affichage actif � l'�cran.

Ces �tapes sont pr�sent�es dans l'exemple suivant�:

Kotlin

private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}

Java

private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}

Vous pouvez maintenant utiliser l'instance de la classe de liaison pour r�f�rencer l'une des vues:

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

Java

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

Utiliser la liaison de vue dans les fragments

Pour configurer une instance de la classe de liaison � utiliser avec un fragment, ex�cutez la commande en suivant les �tapes de la m�thode onCreateView() m�thode:

  1. Appelez la m�thode statique inflate() incluse dans la classe de liaison g�n�r�e. Cette op�ration cr�e une instance de la classe de liaison que le fragment doit utiliser.
  2. Obtenez une r�f�rence � la vue racine en appelant la m�thode getRoot() ou � l'aide d'une propri�t� Kotlin syntaxe.
  3. Renvoyez la vue racine � partir de la m�thode onCreateView() pour en faire la Active�View � l'�cran.

Kotlin

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

Java

private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

Vous pouvez maintenant utiliser l'instance de la classe de liaison pour r�f�rencer l'une des vues:

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

Java

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

Fournir des indications pour diff�rentes configurations

Lorsque vous d�clarez des vues dans plusieurs configurations, d'utiliser un type de vue diff�rent en fonction de la mise en page particuli�re. L'extrait de code suivant en est un exemple:

# in res/layout/example.xml

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" />

Dans ce cas, vous pouvez vous attendre � ce que la classe g�n�r�e expose un champ userBio. de type TextView, car TextView est la classe de base commune. Motif : des limitations techniques, le g�n�rateur de code de liaison de vue ne peut pas le d�terminer. g�n�re � la place un champ View. Cela n�cessite de caster le champ ult�rieurement avec binding.userBio as TextView

Pour contourner cette limitation, la liaison de vue accepte un tools:viewBindingType qui vous permet d'indiquer au compilateur le type � utiliser dans le code g�n�r�. Dans l'exemple pr�c�dent, vous pouvez utiliser cet attribut pour que le compilateur g�n�rez le champ en tant que TextView:

# in res/layout/example.xml (unchanged)

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />

Dans un autre exemple, supposons que vous ayez deux mises en page, l'une contenant un BottomNavigationView et une autre contenant un NavigationRailView. Les deux les classes �tendent NavigationBarView, qui contient la majeure partie de l'impl�mentation plus de d�tails. Si votre code n'a pas besoin de savoir exactement quelle sous-classe se trouve dans la mise en page actuelle, vous pouvez utiliser tools:viewBindingType pour d�finir le saisissez NavigationBarView dans les deux mises en page:

# in res/layout/navigation_example.xml

<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

# in res/layout-w720/navigation_example.xml

<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

La liaison de vue ne peut pas valider la valeur de cet attribut lors de la g�n�ration du code. � �viter les erreurs au moment de la compilation et de l'ex�cution, cette valeur doit r�pondre aux crit�res suivants conditions:

  • La valeur doit �tre une classe qui h�rite de android.view.View.
  • La valeur doit �tre une super-classe du tag sur lequel elle est plac�e. Par exemple, les valeurs suivantes ne fonctionnent pas:

      <TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. -->
      <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
    
  • Le type final doit �tre r�solu de mani�re coh�rente dans toutes les configurations.

Diff�rences par rapport � findViewById

La liaison de vue pr�sente des avantages importants par rapport � l'utilisation de findViewById:

  • S�curit� nulle:�tant donn� que la liaison de vue cr�e des r�f�rences directes aux vues, il n'y a aucun risque d'exception de pointeur nul en raison d'un ID de vue non valide. De plus, lorsqu'une vue n'est pr�sente que dans certaines configurations mise en page, le champ contenant sa r�f�rence dans la classe de liaison est marqu� avec @Nullable.
  • S�ret� du typage:le type des champs de chaque classe de liaison correspond � les vues auxquelles elles font r�f�rence dans le fichier XML. Cela signifie qu'il n'y a aucun risque l'exception de diffusion.

Ces diff�rences signifient des incompatibilit�s entre votre mise en page et votre code entra�ner l'�chec de votre compilation au moment de la compilation plut�t qu'au moment de l'ex�cution.

Comparaison avec la liaison de donn�es

La liaison de vue et la liaison de donn�es g�n�rent toutes deux que vous pouvez utiliser pour r�f�rencer directement des vues. Toutefois, consultez est con�ue pour g�rer des cas d'utilisation plus simples et offre les fonctionnalit�s suivantes : par rapport � la liaison de donn�es:

  • Compilation plus rapide:la liaison de vue ne n�cessite aucun traitement d'annotation. les temps de compilation sont plus courts.
  • Facilit� d'utilisation:la liaison de vue ne n�cessite pas de mise en page XML avec des balises sp�cifiques. pour une adoption plus rapide dans vos applications. Une fois que vous avez activ� la liaison de vue dans d'un module, elle s'applique automatiquement � toutes ses mises en page.

En revanche, la liaison de vue pr�sente les limites suivantes par rapport aux liaison:

Pour cette raison, il est parfois pr�f�rable d'utiliser les deux vues et la liaison de donn�es dans un projet. Vous pouvez utiliser la liaison de donn�es dans les mises en page n�cessitent des fonctionnalit�s avanc�es et utilisent la liaison de vue dans les mises en page qui n'en ont pas besoin.

Ressources suppl�mentaires

Pour en savoir plus sur la liaison de vue, consultez les ressources suppl�mentaires suivantes:

Exemples

Blogs

Vid�os