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.