Ako pridať väzbu zobrazenia do projektu Android Gradle

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.