View Binding olakšava pisanje koda koji je u interakciji s pogledima. Evo kako to postaviti u svom Android Gradle projektu.
Većina Android programera vjerojatno je upoznata s klasikom findViewById()
metoda. Proslijedite mu ID jednog od prikaza u vašem XML rasporedu i vratit će referencu na napuhanu verziju tog prikaza. To je sve pod pretpostavkom da ste proslijedili ispravan ID i da View stvarno postoji. findViewById()
nema ugrađene provjere koje bi vas spriječile da pokušate dohvatiti pogled koji ne možete dohvatiti. Unesite View Binding.
Umjesto korištenja findViewById()
na svakom prikazu koji želite, View Binding automatski generira klasu vezivanja za svaki XML raspored. Svaki pogled s ID-om automatski se dodaje klasi, tako da ih možete izravno referencirati.
Dodavanje View Bindinga Android Gradle projektu je super jednostavno.
Postavljanje Gradle
View Binding omogućen je na razini modula u Gradleu. Ako imate više modula, morat ćete ga omogućiti pojedinačno za svaki.
u android
blok na razini vašeg modula build.gradle
, dodajte opciju za omogućavanje povezivanja prikaza.
android {
...
buildFeatures {
viewBinding true
}
}
Možda postoji upozorenje o ilegalnom pristupu, ali to je greška i može se zanemariti.
Sinkronizirajte projekt i povezivanje prikaza bit će omogućeno. Tako je jednostavno.
Korištenje povezivanja pogleda
Postoji nekoliko načina za korištenje View Bindinga, ali prije nego što se bilo što od toga dogodi, razgovarajmo o tome kako se generiraju klase vezanja.
Sintaksa naziva klase
Recimo da imate XML raspored pod nazivom some_layout.xml
. Njegova odgovarajuća klasa vezivanja bit će imenovana SomeLayoutBinding
. Taj obrazac vrijedi za sve datoteke.
Svaka riječ (odvojena podvlakama u nazivu datoteke) bit će napisana velikim slovima, a podvlake će biti uklonjene. "Uvezivanje" se tada dodaje na kraj.
Instanciranje s postojećim prikazom
Ako ste već napuhali datoteku izgleda i imate referencu na korijen izgleda, možete reći klasi povezivanja View da koristi postojeći izgled.
Kotlin:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
Na primjer, ako želite koristiti klasu vezivanja u fragmentu, to bi izgledalo otprilike ovako.
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 s novim prikazom
Klasa vezanja također se može pobrinuti za napuhavanje izgleda umjesto vas.
Kotlin:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
Ova je metoda korisna i u fragmentima i u aktivnostima.
An primjer Fragment izgledalo bi otprilike ovako.
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 primjer Aktivnost izgledalo bi otprilike ovako.
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());
}
}
Referenciranje pogleda
Sada kada je klasa povezivanja View postavljena i spremna za korištenje, vrijeme je da je stvarno upotrijebite.
Recimo sadržaj some_layout.xml
su nešto poput sljedećeg:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Postoji mnogo ID-ova koji se mogu referencirati u kodu. Ali sve dok imate instanciranu klasu povezivanja, referenciranje će biti jednostavno.
U Kotlinu, pogledi su navedeni varijablama koje odgovaraju njihovim ID-ovima, uz neke promjene. Podvlake se uklanjaju i dobiveni niz je u obliku deve. Na primjer, za referencu some_frame_layout
iz koda koji biste upotrijebili binding.someFrameLayout
. The someFrameLayout
varijabla će biti instanca FrameLayout-a.
val someFrameLayout: FrameLayout = binding.someFrameLayout
U Javi, Views se referenciraju getter metodama koje odgovaraju njihovim ID-ovima, s formatom sličnim Kotlinu. Na primjer, za referencu some_frame_layout
, koristili biste binding.getSomeFrameLayout()
. Metoda će vratiti instancu FrameLayout-a.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Reference Pogleda također su izravnane u uvezivanju. Referenciranje inner_imageview
je isto što i referenciranje some_frame_layout
.
Zaključak
Kao što sam siguran da vidite, View Binding u Androidu je jednostavan za implementaciju i korištenje. U mnogim je slučajevima lakši za korištenje od findViewById()
.
Za više pojedinosti o implementaciji View Binding, zajedno s nekim primjerima, pogledajte Googleovu službenu dokumentaciju.