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()
:
- 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. - Obtenez une r�f�rence � la vue racine en appelant la m�thode
getRoot()
ou � l'aide d'une propri�t� Kotlin syntaxe. - 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:
- 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. - Obtenez une r�f�rence � la vue racine en appelant la m�thode
getRoot()
ou � l'aide d'une propri�t� Kotlin syntaxe. - 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:
- La liaison de vue n'est pas compatible avec les variables de mise en page ou la mise en page des expressions. Vous ne pouvez donc pas l'utiliser pour d�clarer le contenu d'une UI dynamique directement � partir de fichiers de mise en page XML.
- La liaison de vue n'est pas compatible avec les donn�es bidirectionnelles de 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
Recommandations personnalis�es
- Remarque�: Le texte du lien s'affiche lorsque JavaScript est d�sactiv�
- Effectuer une migration depuis Kotlin�Synthetics vers la liaison de vue Jetpack
- Dispositions et expressions de liaison
- Architecture de l'application : couche d'interface utilisateur – Premiers pas – Développeurs Android