View Binding uľahčuje písanie kódu, ktorý interaguje so zobrazeniami. Tu je postup, ako to nastaviť v projekte Android Gradle.
Väčšina vývojárov Androidu pravdepodobne pozná klasiku findViewById()
metóda. Odovzdajte mu ID jedného zo zobrazení vo svojom rozložení XML a vráti odkaz na nafúknutú verziu tohto zobrazenia. To všetko za predpokladu, že ste odovzdali správne ID a že zobrazenie skutočne existuje. findViewById()
nemá zabudované žiadne kontroly, ktoré by vám bránili v pokuse o získanie zobrazenia, ktoré nemôžete získať. Zadajte Viazanie zobrazenia.
Namiesto použitia findViewById()
v každom požadovanom zobrazení funkcia View Binding automaticky vygeneruje triedu väzby pre každý XML layout. Každé zobrazenie s ID sa automaticky pridá do triedy, takže naň môžete priamo odkazovať.
Pridanie funkcie View Binding do projektu Android Gradle je veľmi jednoduché.
Nastavenie Gradle
Viazanie zobrazenia je povolené na úrovni modulu v Gradle. Ak máte viacero modulov, budete ich musieť povoliť jednotlivo pre každý z nich.
V android
blok na úrovni vášho modulu build.gradle
, pridajte možnosť aktivovať Viazanie zobrazenia.
android {
...
buildFeatures {
viewBinding true
}
}
Môže sa zobraziť varovanie o nezákonnom prístupe, ale to je chyba, ktorú možno bezpečne ignorovať.
Synchronizujte projekt a povolí sa väzba zobrazenia. Je to také jednoduché.
Použitie väzby zobrazenia
Existuje niekoľko spôsobov, ako použiť funkciu View Binding, ale predtým, ako sa niečo z toho stane, poďme si povedať, ako sa generujú triedy väzby.
Syntax názvu triedy
Povedzme, že máte názov XML rozloženia some_layout.xml
. Jeho zodpovedajúca väzobná trieda bude pomenovaná SomeLayoutBinding
. Tento vzor platí pre všetky súbory.
Každé slovo (oddelené podčiarkovníkom v názve súboru) bude veľké a podčiarkovníky budú odstránené. "Väzba" sa potom pridá na koniec.
Vytvorenie inštancie s existujúcim zobrazením
Ak ste už nafúkli súbor rozloženia a máte odkaz na koreň rozloženia, triede väzby View môžete povedať, aby použila existujúce rozloženie.
Kotlin:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
Napríklad, ak by ste chceli použiť triedu väzby vo Fragmente, vyzeralo by to asi takto.
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);
}
}
Vytváranie inštancií s novým pohľadom
Trieda viazania sa môže postarať aj o nafúknutie layoutu za vás.
Kotlin:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
Táto metóda je užitočná pre Fragmenty aj aktivity.
An príklad Fragment by vyzeralo asi takto.
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 príklad Aktivita by vyzeralo asi takto.
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());
}
}
Odkazujúce pohľady
Teraz, keď je trieda väzby View nastavená a pripravená na použitie, je čas ju skutočne použiť.
Povedzme obsah some_layout.xml
sú niečo ako nasledovné:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Existuje veľa ID, na ktoré možno odkazovať v kóde. Ale pokiaľ máte inštanciu triedy viazania, odkazovanie bude jednoduché.
V Kotline sa na zobrazenia odkazujú premenné zodpovedajúce ich ID, s určitými zmenami. Podčiarkovníky sa odstránia a výsledný reťazec je obalený ťavou. Napríklad odkazovať some_frame_layout
z kódu, ktorý by ste použili binding.someFrameLayout
. The someFrameLayout
premenná bude inštanciou FrameLayout.
val someFrameLayout: FrameLayout = binding.someFrameLayout
V jazyku Java sú zobrazenia odkazované metódami získavania, ktoré zodpovedajú ich ID, s podobným formátom ako Kotlin. Napríklad odkazovať some_frame_layout
, použili by ste binding.getSomeFrameLayout()
. Metóda vráti inštanciu FrameLayout.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Odkazy View sú vo väzbe tiež sploštené. Odkazovanie inner_imageview
je to isté ako odkazovanie some_frame_layout
.
Záver
Ako som si istý, môžete vidieť, View Binding v systéme Android je ľahko implementovateľný a ľahko použiteľný. V mnohých prípadoch je použitie jednoduchšie ako findViewById()
.
Viac podrobností o implementácii View Binding spolu s niekoľkými príkladmi nájdete pozrite si oficiálnu dokumentáciu Google.