Näkymien sidonta helpottaa näkymien kanssa vuorovaikutuksessa olevan koodin kirjoittamista. Näin määrität sen Android Gradle -projektissasi.
Useimmat Android-kehittäjät ovat luultavasti tuttuja klassikkoon findViewById()
menetelmä. Anna sille jonkin XML-asettelusi näkymän tunnus, niin se palauttaa viittauksen kyseisen näkymän liioiteltuun versioon. Tämä kaikki edellyttää kuitenkin, että olet läpäissyt oikean tunnuksen ja että näkymä on todella olemassa. findViewById()
ei sisällä sisäänrakennettuja tarkistuksia, jotka estävät sinua yrittämästä hakea näkymää, jota et voi noutaa. Anna näkymän sidonta.
Käyttämisen sijaan findViewById()
Jokaisessa haluamassasi näkymässä View Binding luo automaattisesti sidontaluokan kullekin asettelun XML: lle. Jokainen näkymä, jolla on tunnus, lisätään automaattisesti luokkaan, joten voit viitata niihin suoraan.
View Bindingin lisääminen Android Gradle -projektiin on erittäin helppoa.
Gradlen asetukset
View Binding on käytössä moduulitasolla Gradlessa. Jos sinulla on useita moduuleja, sinun on otettava se käyttöön erikseen jokaiselle.
Vuonna android
lohko moduulitasollasi build.gradle
, lisää vaihtoehto ottaaksesi näkymän sidon käyttöön.
android {
...
buildFeatures {
viewBinding true
}
}
Laittomasta pääsystä saattaa olla varoitus, mutta se on nukkavirhe, joka voidaan jättää huomiotta.
Synkronoi projekti ja View Binding otetaan käyttöön. Se on niin helppoa.
View Bindingin käyttäminen
On olemassa muutamia tapoja käyttää View Bindingiä, mutta ennen kuin mitään tapahtuu, puhutaanpa siitä, kuinka sidontaluokat luodaan.
Luokan nimen syntaksi
Oletetaan, että sinulla on asettelu XML some_layout.xml
. Sitä vastaava sitomisluokka nimetään SomeLayoutBinding
. Tämä malli pätee kaikkiin tiedostoihin.
Jokainen sana (joka on erotettu alaviivalla tiedoston nimessä) kirjoitetaan isolla kirjaimella ja alaviivat poistetaan. "Sidonta" lisätään sitten loppuun.
Instantiointi olemassa olevalla näkymällä
Jos olet jo täyttänyt asettelutiedoston ja sinulla on viittaus asettelun juureen, voit käskeä View-sidontaluokan käyttämään olemassa olevaa asettelua.
Kotlin:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
Jos esimerkiksi haluat käyttää sidontaluokkaa fragmentissa, se näyttäisi suunnilleen tältä.
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);
}
}
Instantiointi uudella näkymällä
Sidontaluokka voi myös huolehtia ulkoasun paisuttamisesta puolestasi.
Kotlin:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
Tämä menetelmä on hyödyllinen sekä fragmenteissa että aktiviteetteissa.
An esimerkkifragmentti näyttäisi jotain seuraavalta.
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 esimerkkitoiminto näyttäisi jotain seuraavalta.
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());
}
}
Näkymiin viittaaminen
Nyt kun View-sidontaluokka on määritetty ja valmis käytettäväksi, on aika ottaa se käyttöön.
Sanotaanpa sisällön some_layout.xml
ovat jotain seuraavanlaisia:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Siellä on paljon tunnuksia, joihin koodissa viitataan. Mutta niin kauan kuin sinulla on sidontaluokka instantoituna, viittaus on helppoa.
Kotlinissa näkymiin viittaavat muuttujat, jotka vastaavat niiden tunnuksia, joissakin muutoksissa. Alaviivat poistetaan ja tuloksena oleva merkkijono on kamelikotelo. Esimerkiksi viittaukseksi some_frame_layout
koodista, käytät binding.someFrameLayout
. The someFrameLayout
muuttuja on FrameLayout-esiintymä.
val someFrameLayout: FrameLayout = binding.someFrameLayout
Javassa Viewsiin viitataan getter-menetelmillä, jotka vastaavat niiden tunnuksia, samankaltaisessa muodossa kuin Kotlin. Esimerkiksi viittaukseksi some_frame_layout
, käyttäisit binding.getSomeFrameLayout()
. Menetelmä palauttaa FrameLayout-esiintymän.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
View-viittaukset on myös litistetty sidonnassa. Viittaus inner_imageview
on sama kuin viittaus some_frame_layout
.
Johtopäätös
Kuten olen varma, että näet, View Binding Androidissa on sekä helppo ottaa käyttöön että helppokäyttöinen. Monissa tapauksissa sitä on helpompi käyttää kuin findViewById()
.
Jos haluat lisätietoja View Bindingin käyttöönotosta sekä joitain esimerkkejä, tutustu Googlen viralliseen dokumentaatioon.