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