Rodinio susiejimas leidžia lengviau rašyti kodą, kuris sąveikauja su rodiniais. Štai kaip jį nustatyti „Android Gradle“ projekte.
Daugelis „Android“ kūrėjų tikriausiai yra susipažinę su klasika findViewById()
metodas. Perduokite jam vieno iš rodinių savo XML makete ID ir jis grąžins nuorodą į padidintą to rodinio versiją. Vis dėlto darant prielaidą, kad išdavėte tinkamą ID ir rodinys iš tikrųjų egzistuoja. findViewById()
neturi integruotų patikrų, kurios neleistų jums bandyti nuskaityti rodinio, kurio negalite gauti. Įveskite „View Binding“.
Užuot vartoję findViewById()
kiekviename norimame rodinyje View Binding automatiškai sugeneruoja kiekvieno maketo XML susiejimo klasę. Kiekvienas rodinys su ID automatiškai įtraukiamas į klasę, todėl galite tiesiogiai juos nurodyti.
Pridėti „View Binding“ prie „Android Gradle“ projekto yra labai paprasta.
Gradle sąranka
Rodinio susiejimas įjungtas modulio lygiu programoje Gradle. Jei turite kelis modulius, kiekvienam iš jų turėsite juos įjungti atskirai.
Viduje android
blokuoti savo modulio lygiu build.gradle
, pridėkite parinktį, kad įjungtumėte „View Binding“.
android {
...
buildFeatures {
viewBinding true
}
}
Gali būti įspėjimas apie nelegalią prieigą, bet tai yra pūkų klaida ir į ją galima saugiai nepaisyti.
Sinchronizuokite projektą ir bus įjungtas peržiūros susiejimas. Tai taip paprasta.
Rodinio įrišimo naudojimas
Yra keletas būdų, kaip naudoti „View Binding“, tačiau prieš tai įvykstant pakalbėkime apie tai, kaip generuojamos susiejimo klasės.
Klasės pavadinimo sintaksė
Tarkime, kad turite XML išdėstymo pavadinimą some_layout.xml
. Bus pavadinta atitinkama įrišimo klasė SomeLayoutBinding
. Šis modelis tinka visiems failams.
Kiekvienas žodis (failo pavadinime atskirtas apatiniais brūkšniais) bus rašomas didžiosiomis raidėmis, o apatiniai brūkšniai bus pašalinti. Tada „Binding“ pridedamas prie pabaigos.
Sukūrimas naudojant esamą vaizdą
Jei jau padidinote maketo failą ir turite nuorodą į išdėstymo šaknį, galite nurodyti įrišimo klasei View naudoti esamą maketą.
Kotlinas:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
Pavyzdžiui, jei norėtumėte naudoti įrišimo klasę fragmente, ji atrodytų maždaug taip.
Kotlinas:
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);
}
}
Momentų kūrimas naudojant naują vaizdą
Įrišimo klasė taip pat gali pasirūpinti, kad išdėstymas būtų išpūstas už jus.
Kotlinas:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
Šis metodas yra naudingas tiek fragmentams, tiek veikloms.
An pavyzdys Fragmentas atrodytų maždaug taip.
Kotlinas:
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 Veiklos pavyzdys atrodytų maždaug taip.
Kotlinas:
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());
}
}
Nuorodų rodiniai
Dabar, kai „View“ įrišimo klasė nustatyta ir paruošta naudoti, laikas ją iš tikrųjų naudoti.
Tarkime, turinio some_layout.xml
yra kažkas panašaus į šiuos:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Kode yra daug ID. Tačiau tol, kol turėsite įrišimo klasę, nuorodų sudarymas bus lengvas.
Kotline rodiniai nurodomi pagal kintamuosius, atitinkančius jų ID, su tam tikrais pakeitimais. Pabraukimai pašalinami, o gauta eilutė yra kupranugario apvalkalu. Pavyzdžiui, nuoroda some_frame_layout
iš kodo, naudotumėte binding.someFrameLayout
. The someFrameLayout
kintamasis bus FrameLayout pavyzdys.
val someFrameLayout: FrameLayout = binding.someFrameLayout
Java programoje rodiniai nurodomi naudojant geterių metodus, atitinkančius jų ID, panašiu į Kotlin formatu. Pavyzdžiui, nuoroda some_frame_layout
, jūs naudotumėte binding.getSomeFrameLayout()
. Metodas grąžins FrameLayout egzempliorių.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Rodinio nuorodos įrišime taip pat suplotos. Nuoroda inner_imageview
yra tas pats, kas nuoroda some_frame_layout
.
Išvada
Kaip esu tikras, matote, „View Binding“ sistemoje „Android“ lengva įdiegti ir naudoti. Daugeliu atvejų tai lengviau naudoti nei findViewById()
.
Norėdami gauti daugiau informacijos apie rodinio susiejimo diegimą ir keletą pavyzdžių, peržiūrėkite oficialią „Google“ dokumentaciją.