Kaip pridėti „View Binding“ prie „Android Gradle“ projekto

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