A View Binding hozzáadása egy Android Gradle projekthez

A View Binding megkönnyíti a nézetekkel kölcsönhatásba lépő kód írását. Így állíthatja be az Android Gradle projektben.

A legtöbb Android fejlesztő valószínűleg ismeri a klasszikust findViewById() módszer. Adja át neki az XML-elrendezésben található nézetek egyikének azonosítóját, és ez a nézet felfújt verziójára való hivatkozást ad vissza. Ez minden, feltéve, hogy átadta a megfelelő azonosítót, és a nézet valóban létezik. findViewById() nem rendelkezik beépített ellenőrzésekkel, amelyek megakadályozzák, hogy olyan nézetet próbáljon lekérni, amelyet nem tud letölteni. Lépjen be a View Bindingbe.

Használat helyett findViewById() Minden egyes kívánt nézeten a View Binding automatikusan létrehoz egy kötési osztályt minden egyes elrendezés XML-hez. Minden azonosítóval rendelkező nézet automatikusan hozzáadódik az osztályhoz, így közvetlenül hivatkozhat rájuk.

A View Binding hozzáadása egy Android Gradle projekthez rendkívül egyszerű.

Gradle beállítása

A View Binding modulszinten engedélyezett a Gradle-ben. Ha több modulja van, akkor mindegyikhez külön-külön kell engedélyeznie.

Ban,-ben android blokk a modul szintjén build.gradle, adja hozzá a View Binding engedélyezésére szolgáló lehetőséget.

android {
...

buildFeatures {
viewBinding true
}
}

Lehet, hogy figyelmeztetés jelenik meg az illegális hozzáférésre, de ez egy szösz hiba, és nyugodtan figyelmen kívül hagyható.

Szinkronizálja a projektet, és a View Binding engedélyezve lesz. Ez olyan könnyű.

Nézetkötés használata

Számos módja van a View Binding használatának, de mielőtt ez megtörténne, beszéljünk arról, hogyan jönnek létre a kötési osztályok.

Osztálynév Szintaxis

Tegyük fel, hogy van egy XML nevű elrendezése some_layout.xml. A megfelelő kötési osztály neve lesz SomeLayoutBinding. Ez a minta minden fájlra érvényes.

Minden szó (a fájlnévben aláhúzásjellel elválasztva) nagybetűs lesz, és az aláhúzás törlődik. A "Binding" ezután hozzáadódik a végéhez.

Példányosítás a meglévő nézettel

Ha már felfújta az elrendezésfájlt, és van hivatkozása az elrendezés gyökerére, akkor megmondhatja a View kötési osztálynak, hogy használja a meglévő elrendezést.

Kotlin:

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

Jáva:

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

Például, ha a kötési osztályt szeretné használni egy töredékben, az valahogy így nézne ki.

Kotlin:

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.
}
}

Jáva:

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);
}
}

Példányosítás új nézettel

A kötésosztály gondoskodhat az elrendezés felfújásáról is.

Kotlin:

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

Jáva:

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

Ez a módszer a töredékeknél és a tevékenységeknél egyaránt hasznos.

An példa Töredék valahogy így nézne ki.

Kotlin:

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
}
}

Jáva:

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();
}
}

An példa Tevékenység valahogy így nézne ki.

Kotlin:

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)
}
}

Jáva:

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());
}
}

Nézetekre hivatkozva

Most, hogy a View kötési osztály be van állítva, és készen áll a használatra, ideje ténylegesen használni.

Mondjuk a tartalmat a some_layout.xml ilyesmik a következők:

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

Nagyon sok azonosító található a kódban. De amíg a kötési osztály példányosítva van, a hivatkozás egyszerű lesz.

A Kotlinban a nézetekre az azonosítójuknak megfelelő változók hivatkoznak, némi változtatással. Az aláhúzás törlődik, és a kapott karakterlánc tevebetétes lesz. Például hivatkozni some_frame_layout kódból használnád binding.someFrameLayout. A someFrameLayout változó a FrameLayout egy példánya lesz.

val someFrameLayout: FrameLayout = binding.someFrameLayout

A Java-ban a nézetekre az azonosítóiknak megfelelő getter metódusok hivatkoznak, a Kotlinhoz hasonló formátumban. Például hivatkozni some_frame_layout, használnád binding.getSomeFrameLayout(). A metódus a FrameLayout egy példányát adja vissza.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

A Nézet hivatkozások a kötésben is lapítva vannak. Hivatkozás inner_imageview ugyanaz, mint a hivatkozás some_frame_layout.

Következtetés

Biztos vagyok benne, hogy láthatja, a View Binding Android rendszerben könnyen megvalósítható és könnyen használható. Sok esetben könnyebben használható, mint findViewById().

A View Binding megvalósításával kapcsolatos további részletekért, valamint néhány példát, nézze meg a Google hivatalos dokumentációját.