Jak přidat View Binding do projektu Android Gradle

View Binding usnadňuje psaní kódu, který interaguje s pohledy. Zde je návod, jak jej nastavit v projektu Android Gradle.

Většina Android vývojářů pravděpodobně zná klasiku findViewById() metoda. Předejte mu ID jednoho z pohledů ve vašem rozvržení XML a vrátí odkaz na nafouknutou verzi tohoto pohledu. To vše za předpokladu, že jste předali správné ID a že zobrazení skutečně existuje. findViewById() nemá zabudované žádné kontroly, které by vám bránily ve snaze získat pohled, který nemůžete načíst. Zadejte vazbu zobrazení.

Místo použití findViewById() v každém požadovaném pohledu funkce View Binding automaticky vygeneruje třídu vazby pro každý XML rozvržení. Každý pohled s ID je automaticky přidán do třídy, takže na něj můžete přímo odkazovat.

Přidání funkce View Binding do projektu Android Gradle je velmi jednoduché.

Nastavení Gradle

View Binding je povoleno na úrovni modulu v Gradle. Pokud máte více modulů, budete je muset povolit pro každý zvlášť.

V android blok na úrovni vašeho modulu build.gradle, přidejte možnost povolit vazbu zobrazení.

android {
...

buildFeatures {
viewBinding true
}
}

Může se objevit varování o nelegálním přístupu, ale to je chyba, která se nepouští vlákna a lze ji bezpečně ignorovat.

Synchronizujte projekt a bude povolena vazba zobrazení. Je to tak snadné.

Použití vazby pohledu

Existuje několik způsobů, jak použít View Binding, ale než k tomu dojde, promluvme si o tom, jak jsou generovány třídy vazeb.

Syntaxe názvu třídy

Řekněme, že máte rozvržení XML pojmenované some_layout.xml. Jeho odpovídající třída vazby bude pojmenována SomeLayoutBinding. Tento vzor platí pro všechny soubory.

Každé slovo (oddělené podtržítky v názvu souboru) bude velké a podtržítka budou odstraněna. "Vazba" se pak přidá na konec.

Vytváření instancí se stávajícím pohledem

Pokud jste již nafoukli soubor rozvržení a máte odkaz na kořen rozvržení, můžete třídě vazby View říci, aby použila existující rozvržení.

Kotlin:

val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)

Jáva:

SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);

Pokud byste například chtěli použít třídu vazby ve Fragmentu, vypadalo by to nějak 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.
}
}

Jáva:

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);
}
}

Instantování s novým pohledem

Třída vázání se může postarat i o nafouknutí layoutu za vás.

Kotlin:

val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)

Jáva:

SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);

Tato metoda je užitečná pro Fragmenty i aktivity.

An příklad Fragment by vypadalo nějak následovně.

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
}
}

Jáva:

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 příklad Aktivita by vypadalo nějak následovně.

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)
}
}

Jáva:

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ící pohledy

Nyní, když je třída vazby View nastavena a připravena k použití, je čas ji skutečně použít.

Řekněme obsah some_layout.xml jsou něco jako následující:

 android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>

Existuje mnoho ID, na která lze odkazovat v kódu. Ale pokud máte vytvořenou třídu vazby, bude odkazování snadné.

V Kotlinu jsou zobrazení odkazována proměnnými odpovídajícími jejich ID, s určitými změnami. Podtržítka jsou odstraněna a výsledný řetězec je v velbloudím pouzdře. Například odkazovat some_frame_layout z kódu, který byste použili binding.someFrameLayout. The someFrameLayout proměnná bude instancí FrameLayout.

val someFrameLayout: FrameLayout = binding.someFrameLayout

V Javě jsou pohledy odkazovány metodami získávání, které odpovídají jejich ID, s podobným formátem jako Kotlin. Například odkazovat some_frame_layout, použili byste binding.getSomeFrameLayout(). Metoda vrátí instanci FrameLayout.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

Odkazy View jsou ve vazbě také zploštělé. Odkazování inner_imageview je stejné jako odkazování some_frame_layout.

Závěr

Jak jistě vidíte, View Binding v Androidu se snadno implementuje a snadno používá. V mnoha případech je použití jednodušší než findViewById().

Další podrobnosti o implementaci View Binding spolu s některými příklady naleznete podívejte se na oficiální dokumentaci Google.