ViewBinding - comment obtenir la liaison pour les mises en page incluses?
11
En travaillant avec ViewBinding, je rencontre peu de cas non documentés.
Premièrement: comment obtenir la liaison pour les pièces de disposition de vue générique incluses, la liaison principale ne voit que les éléments de la disposition principale?
Deuxièmement: comment obtenir la liaison pour les parties de disposition de type de fusion incluses, encore une fois la liaison principale ne voit que les éléments de la disposition principale?
Inclure avec la disposition générique (pas fusionner le noeud), nous devons attribuer un ID à la partie incluse, de cette façon, dans la liaison, nous aurons accès à la sous-partie incluse
private lateinit var exampleBinding:ActivityExampleBinding//activity_example.xml layoutoverride fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
exampleBinding =ActivityExampleBinding.inflate(layoutInflater)
setContentView(exampleBinding.root)//we will be able to access included layouts view like this
val includedView:View= exampleBinding.yourId.idOfIncludedView//[...]}
Inclure avec le bloc de fusion dans la mise en page externe. Nous ne pouvons pas y ajouter d'ID car le bloc de fusion n'est pas une vue. Disons que nous avons une telle disposition de fusion éternelle (merge_layout.xm):
Pour lier correctement une telle disposition de fusion, nous devons:
Dans votre code d'activité:
private lateinit var exampleBinding:ActivityExampleBinding//activity_example.xml layoutprivate lateinit var mergeBinding:MergeLayoutBinding//merge_layout.xml layoutoverride fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
exampleBinding =ActivityExampleBinding.inflate(layoutInflater)//we need to bind the root layout with our binder for external layout
mergeBinding =MergeLayoutBinding.bind(exampleBinding.root)
setContentView(exampleBinding.root)//we will be able to access included in merge layout views like this
val mergedView:View= mergeBinding.someView//[...]}
Réponse très simple et utilise la nouvelle syntaxe - tout cela fonctionne pour moi dans une activité non fragmentaire avec une syntaxe similaire dans onCreate(). Merci. (Juste avoir un peu de mal à utiliser pour un DrawerLayout)
Fat Monk
0
L'autre moyen simple serait d'utiliser la bibliothèque de liaison de données. Enveloppez ensuite votre disposition XML avec une balise afin que si vous utilisez la bibliothèque, elle génère automatiquement les classes requises pour lier les vues de la disposition à vos objets de données. Honnêtement, je pense que c'est la voie à suivre. Suivez le guide ici
Votre première question, qui fonctionne avec une mise en page incluse à l'aide de ViewBinding, peut être résolue si facilement.
Voici un exemple de fichier main_fragment.xml
Et MainFragment.java peut être comme ça
Maintenant, vous avez deux liaisons. l'un d'eux est celui par défaut et le suivant provient de la disposition incluse.
la source
onCreate()
. Merci. (Juste avoir un peu de mal à utiliser pour unDrawerLayout
)L'autre moyen simple serait d'utiliser la bibliothèque de liaison de données. Enveloppez ensuite votre disposition XML avec une balise afin que si vous utilisez la bibliothèque, elle génère automatiquement les classes requises pour lier les vues de la disposition à vos objets de données. Honnêtement, je pense que c'est la voie à suivre. Suivez le guide ici
la source