Πώς να προσθέσετε το View Binding σε ένα έργο Android Gradle

Το View Binding διευκολύνει τη σύνταξη κώδικα που αλληλεπιδρά με τις προβολές. Δείτε πώς μπορείτε να το ρυθμίσετε στο έργο σας στο Android Gradle.

Οι περισσότεροι προγραμματιστές Android είναι πιθανώς εξοικειωμένοι με το κλασικό findViewById() μέθοδος. Δώστε του ένα αναγνωριστικό μιας από τις προβολές στη διάταξη XML και θα επιστρέψει μια αναφορά στη διογκωμένη έκδοση αυτής της προβολής. Όλα αυτά όμως υποθέτουμε ότι δώσατε το σωστό αναγνωριστικό και ότι η προβολή υπάρχει στην πραγματικότητα. findViewById() δεν έχει ενσωματωμένους ελέγχους που να σας εμποδίζουν να προσπαθήσετε να ανακτήσετε μια προβολή που δεν μπορείτε να ανακτήσετε. Εισαγάγετε το View Binding.

Αντί να χρησιμοποιείτε findViewById() σε κάθε προβολή που θέλετε, το View Binding δημιουργεί αυτόματα μια κλάση δέσμευσης για κάθε διάταξη XML. Κάθε προβολή με αναγνωριστικό προστίθεται αυτόματα στην τάξη, ώστε να μπορείτε να την αναφέρετε απευθείας.

Η προσθήκη View Binding σε ένα έργο Android Gradle είναι εξαιρετικά απλή.

Ρύθμιση Gradle

Το View Binding είναι ενεργοποιημένο σε επίπεδο μονάδας στο Gradle. Εάν έχετε πολλές ενότητες, θα πρέπει να τις ενεργοποιήσετε ξεχωριστά για κάθε μία.

Στο android μπλοκ στο επίπεδο της ενότητας σας build.gradle, προσθέστε την επιλογή για να ενεργοποιήσετε την Προβολή δέσμευσης.

android {
...

buildFeatures {
viewBinding true
}
}

Μπορεί να υπάρχει μια προειδοποίηση σχετικά με την παράνομη πρόσβαση, αλλά αυτό είναι ένα σφάλμα χνούδι και μπορεί να αγνοηθεί με ασφάλεια.

Συγχρονίστε το έργο και θα ενεργοποιηθεί η Προβολή δέσμευσης. Είναι τόσο εύκολο.

Χρήση Προβολής δέσμευσης

Υπάρχουν μερικοί τρόποι να χρησιμοποιήσετε το View Binding, αλλά πριν συμβεί κάτι από αυτά, ας μιλήσουμε για το πώς δημιουργούνται οι κλάσεις δέσμευσης.

Σύνταξη ονόματος τάξης

Ας υποθέσουμε ότι έχετε μια διάταξη XML με το όνομα some_layout.xml. Η αντίστοιχη κλάση σύνδεσης θα ονομαστεί SomeLayoutBinding. Αυτό το μοτίβο ισχύει για όλα τα αρχεία.

Κάθε λέξη (διαχωρισμένη με υπογράμμιση στο όνομα του αρχείου) θα γράφεται με κεφαλαία και οι κάτω παύλες θα αφαιρούνται. Στη συνέχεια, το "Binding" προστίθεται στο τέλος.

Στιγμιότυπο με την υπάρχουσα προβολή

Εάν έχετε ήδη διογκώσει το αρχείο διάταξης και έχετε αναφορά στη ρίζα της διάταξης, μπορείτε να πείτε στην κλάση δέσμευσης Προβολή να χρησιμοποιήσει την υπάρχουσα διάταξη.

Κότλιν:

val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)

Ιάβα:

SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);

Για παράδειγμα, αν θέλετε να χρησιμοποιήσετε την κλάση δέσμευσης σε ένα Fragment, θα ήταν κάπως έτσι.

Κότλιν:

classSomeFragment : Fragment(R.layout.some_layout) {
//Lazy initialization means bind() won't be called until "binding" is referenced.
private val binding by lazy { SomeLayoutBinding.bind(view) }

override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)

//Once this method is called, you can start using the binding.
}
}

Ιάβα:

publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;

publicSomeFragment(){
super(R.layout.some_layout);
}

@Override
publicvoidonViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);

//Initialize the binding.
binding = SomeLayoutBinding.bind(view);
}
}

Στιγμιότυπο με τη Νέα προβολή

Η κλάση βιβλιοδεσίας μπορεί επίσης να φροντίσει να φουσκώσει τη διάταξη για εσάς.

Κότλιν:

val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)

Ιάβα:

SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);

Αυτή η μέθοδος είναι χρήσιμη τόσο σε Fragments όσο και σε Δραστηριότητες.

Ενα παράδειγμα Fragment θα έμοιαζε κάτι σαν το παρακάτω.

Κότλιν:

classSomeFragment : Fragment() {
private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?){
//The "root" of the binding class is the root of its layout.
return binding.root
}
}

Ιάβα:

publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;

@Override
publicvoidonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//Initialize the binding.
binding = SomeLayoutBinding.inflate(inflater);
//The "getRoot()" method of the binding class returns the root of the layout.
return binding.getRoot();
}
}

Ενα παράδειγμα Δραστηριότητα θα έμοιαζε κάτι σαν το παρακάτω.

Κότλιν:

classSomeActivity : AppCompatActivity() {
private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }

override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)

//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.root)
}
}

Ιάβα:

publicclassSomeActivityextendsAppCompatActivity{
private SomeLayoutBinding binding = null;

@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

//Instantiate the binding.
binding = SomeLayoutBinding.inflate(getLayoutInflater());
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.getRoot());
}
}

Αναφορά προβολών

Τώρα που η κλάση σύνδεσης Προβολή έχει ρυθμιστεί και είναι έτοιμη για χρήση, ήρθε η ώρα να τη χρησιμοποιήσετε πραγματικά.

Ας πούμε τα περιεχόμενα του some_layout.xml είναι κάτι σαν το εξής:

 android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>

Υπάρχουν πολλά αναγνωριστικά εκεί για αναφορά στον κωδικό. Αλλά εφόσον έχετε την κλάση δέσμευσης, η αναφορά θα είναι εύκολη.

Στο Kotlin, οι προβολές αναφέρονται από μεταβλητές που ταιριάζουν με τα αναγνωριστικά τους, με ορισμένες αλλαγές. Οι κάτω παύλες αφαιρούνται και η χορδή που προκύπτει είναι καμηλό. Για παράδειγμα, για αναφορά some_frame_layout από τον κώδικα, θα χρησιμοποιούσατε binding.someFrameLayout. ο someFrameLayout μεταβλητή θα είναι μια παρουσία του FrameLayout.

val someFrameLayout: FrameLayout = binding.someFrameLayout

Στην Java, οι προβολές αναφέρονται με μεθόδους λήψης που ταιριάζουν με τα αναγνωριστικά τους, με παρόμοια μορφή με το Kotlin. Για παράδειγμα, για αναφορά some_frame_layout, θα χρησιμοποιούσατε binding.getSomeFrameLayout(). Η μέθοδος θα επιστρέψει μια παρουσία του FrameLayout.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

Οι αναφορές Προβολής είναι επίσης ισοπεδωμένες στο δέσιμο. Αναφορά inner_imageview είναι το ίδιο με την αναφορά some_frame_layout.

συμπέρασμα

Όπως είμαι σίγουρος ότι μπορείτε να δείτε, το View Binding στο Android είναι εύκολο στην εφαρμογή και εύκολο στη χρήση. Σε πολλές περιπτώσεις, είναι πιο εύκολο να το χρησιμοποιήσετε παρά findViewById().

Για περισσότερες λεπτομέρειες σχετικά με την εφαρμογή View Binding, μαζί με ορισμένα παραδείγματα, δείτε την επίσημη τεκμηρίωση της Google.