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.