135 votes

ViewBinding - comment obtenir une liaison pour les mises en page incluses ?

En travaillant avec ViewBinding, j'ai rencontré quelques cas non documentés.

Premièrement : Comment obtenir une liaison pour les parties de la vue générique incluses, la liaison principale ne voit que les éléments de la vue principale ?

Deuxièmement : Comment obtenir une liaison pour les parties de la mise en page de type fusion incluses, alors que la liaison principale ne voit que les éléments de la mise en page principale ?

0 votes

L'autre moyen simple serait d'utiliser la bibliothèque de liaison de données. Enveloppez ensuite votre mise en page XML avec la balise <layout> pour que, si vous utilisez la bibliothèque, celle-ci génère automatiquement les classes nécessaires pour lier les vues de la mise en page avec vos objets de données. Honnêtement, je pense que c'est la voie à suivre. Suivez le guide aquí

1 votes

Bonjour, j'ai écrit un article de blog expliquant complètement la liaison de vue et la manipulation de la balise incluse avec la vérification des mises en page de fusion et d'inclusion. Androidbites|ViewBinding

0 votes

Je suis un peu coincé ici : stackoverflow.com/questions/67808297/

0voto

Truwcj Points 11

Utilisation de la bibliothèque de liaison de données. Enveloppez ensuite votre mise en page XML avec <layout> étiquette

activité_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    ... 

    <include 
      android:id="@+id/toolbar"
      layout="@layout/toolbar" />

    ...

</LinearLayout>
</layout>

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView 
        android:id="@+id/ivImage"
        ... />

    <TextView 
        android:id="@+id/tvTitle"
        ... />

</LinearLayout>

MainActivity.kt

private lateinit var binding: ActivityMainBinding  

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    // Access include layout views
    binding.toolbar.rootView.ivImage.setImageResource(R.drawable.ic_back_arrow)
    binding.toolbar.rootView.tvTitle.text = getString(R.string.home)

    ...
}

-2voto

activesince93 Points 1417

Cela peut également être réalisé sans mettre id de include .

activité_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    ... 

    <include layout="@layout/toolbar" />

    ...

</LinearLayout>

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llRootLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView 
        android:id="@+id/ivImage"
        ... />

    <TextView 
        android:id="@+id/tvTitle"
        ... />

</LinearLayout>

MainActivity.kt

private lateinit var binding: ActivityMainBinding  

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    // Access include layout views
    binding.root.ivImage.setImageResource(R.drawable.ic_back_arrow)
    binding.root.tvTitle.text = getString(R.string.home)

    ...
}

1 votes

Vous utilisez les synthétiques Kotlin pour accéder aux vues incluses, et cette API est déjà déprécié

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X