View Binding olajša pisanje kode, ki je v interakciji s pogledi. Tukaj je opisano, kako ga nastavite v svojem projektu Android Gradle.
Večina razvijalcev Android verjetno pozna klasiko findViewById()
metoda. Posredujte mu ID enega od pogledov v vaši postavitvi XML in vrnil bo sklic na napihnjeno različico tega pogleda. To je vse ob predpostavki, da ste posredovali pravi ID in da pogled dejansko obstaja. findViewById()
nima vgrajenih preverjanj, ki bi vam preprečila, da bi poskušali pridobiti pogled, ki ga ne morete pridobiti. Vnesite vezavo pogleda.
Namesto uporabe findViewById()
za vsak pogled, ki ga želite, View Binding samodejno ustvari vezni razred za vsako postavitev XML. Vsak pogled z ID-jem je samodejno dodan v razred, tako da se lahko nanje neposredno sklicujete.
Dodajanje View Binding projektu Android Gradle je izjemno preprosto.
Nastavitev Gradle
Vezava pogleda je omogočena na ravni modula v Gradlu. Če imate več modulov, jih boste morali omogočiti posebej za vsakega posebej.
V android
blok na vaši ravni modula build.gradle
, dodajte možnost za omogočanje vezave pogleda.
android {
...
buildFeatures {
viewBinding true
}
}
Morda obstaja opozorilo o nezakonitem dostopu, vendar je to napaka lint in jo lahko varno prezrete.
Sinhronizirajte projekt in vezava pogleda bo omogočena. Tako enostavno je.
Uporaba vezave pogleda
Obstaja nekaj načinov za uporabo View Binding, a preden se kaj od tega zgodi, se pogovorimo o tem, kako se generirajo vezni razredi.
Sintaksa imena razreda
Recimo, da imate postavitev XML z imenom some_layout.xml
. Njegov ustrezen vezni razred bo imenovan SomeLayoutBinding
. Ta vzorec velja za vse datoteke.
Vsaka beseda (v imenu datoteke ločena s podčrtaji) bo napisana z veliko začetnico, podčrtaji pa bodo odstranjeni. Na koncu se nato doda "vezivanje".
Instanciranje z obstoječim pogledom
Če ste datoteko postavitve že napihnili in imate sklic na koren postavitve, lahko razredu povezovanja Pogled naročite, naj uporabi obstoječo postavitev.
Kotlin:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
Na primer, če bi želeli uporabiti vezni razred v Fragmentu, bi bilo videti nekako takole.
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.
}
}
Java:
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);
}
}
Instanciranje z novim pogledom
Vezalni razred lahko poskrbi tudi za napihovanje postavitve namesto vas.
Kotlin:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
Ta metoda je uporabna tako pri fragmentih kot pri dejavnostih.
An primer Fragment bi izgledal nekako takole.
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
}
}
Java:
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 primer Dejavnost bi izgledal nekako takole.
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)
}
}
Java:
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());
}
}
Sklicevanje na poglede
Zdaj, ko je razred povezovanja Pogled nastavljen in pripravljen za uporabo, je čas, da ga dejansko uporabite.
Recimo vsebino some_layout.xml
so nekaj podobnega naslednjemu:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Tam je veliko ID-jev, na katere se lahko sklicujete v kodi. Toda dokler imate instanciran vezni razred, bo sklicevanje preprosto.
V Kotlinu se pogledi sklicujejo na spremenljivke, ki se ujemajo z njihovimi ID-ji, z nekaj spremembami. Podčrtaji so odstranjeni in nastali niz ima črno črko. Na primer, za referenco some_frame_layout
iz kode, ki bi jo uporabili binding.someFrameLayout
. The someFrameLayout
spremenljivka bo primerek FrameLayout.
val someFrameLayout: FrameLayout = binding.someFrameLayout
V Javi se na poglede sklicujejo metode pridobivanja, ki se ujemajo z njihovimi ID-ji, s podobnim formatom kot Kotlin. Na primer, za referenco some_frame_layout
, bi uporabili binding.getSomeFrameLayout()
. Metoda bo vrnila primerek FrameLayout.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Sklici na pogled so prav tako izravnani v vezavi. Sklicevanje inner_imageview
je enako kot sklicevanje some_frame_layout
.
Zaključek
Kot sem prepričan, da lahko vidite, je View Binding v Androidu enostaven za implementacijo in uporabo. V mnogih primerih je lažji za uporabo kot findViewById()
.
Za več podrobnosti o implementaciji View Binding, skupaj z nekaterimi primeri, preverite Googlovo uradno dokumentacijo.