Как да добавите View Binding към Android Gradle проект

View Binding улеснява писането на код, който взаимодейства с изгледите. Ето как да го настроите във вашия Android Gradle проект.

Повечето разработчици на Android вероятно са запознати с класиката findViewById() метод. Предайте му идентификатор на един от изгледите във вашето XML оформление и той ще върне препратка към раздутата версия на този изглед. Това е всичко, ако приемем, че сте предали правилния идентификатор и че изгледът действително съществува. findViewById() няма вградени проверки, които да ви попречат да се опитате да извлечете изглед, който не можете да извлечете. Въведете View Binding.

Вместо да използвате findViewById() за всеки изглед, който желаете, View Binding автоматично генерира обвързващ клас за всяко XML оформление. Всеки изглед с идентификатор се добавя автоматично към класа, така че можете да ги препращате директно.

Добавянето на View Binding към Android Gradle проект е супер просто.

Настройка на Gradle

View Binding е активирано на ниво модул в Gradle. Ако имате няколко модула, ще трябва да го активирате поотделно за всеки един.

В android блок на вашето модулно ниво build.gradle, добавете опцията за активиране на обвързването на преглед.

android {
...

buildFeatures {
viewBinding true
}
}

Може да има предупреждение за незаконен достъп, но това е бъг с мъх и може спокойно да бъде игнориран.

Синхронизирайте проекта и View Binding ще бъде активирано. Толкова е лесно.

Използване на View Binding

Има няколко начина за използване на View Binding, но преди нещо от това да се случи, нека поговорим за това как се генерират обвързващите класове.

Синтаксис на името на класа

Да кажем, че имате XML оформление с име some_layout.xml. Съответният клас на обвързване ще бъде наименуван SomeLayoutBinding. Този модел важи за всички файлове.

Всяка дума (разделена с долна черта в името на файла) ще бъде написана с главна буква и долната черта ще бъде премахната. След това „обвързване“ се добавя към края.

Създаване на екземпляр със съществуващ изглед

Ако вече сте раздули файла с оформлението и имате препратка към корена на оформлението, можете да кажете на класа за свързване на View да използва съществуващото оформление.

Котлин:

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

Java:

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

Например, ако искате да използвате класа за обвързване във фрагмент, това ще изглежда по следния начин.

Котлин:

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

Създаване на екземпляр с нов изглед

Обвързващият клас може също да се погрижи за раздуването на оформлението вместо вас.

Котлин:

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

Java:

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

Този метод е полезен както при фрагменти, така и при дейности.

Ан примерен фрагмент ще изглежда по следния начин.

Котлин:

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

Ан примерна дейност ще изглежда по следния начин.

Котлин:

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

Рефериране на изгледи

Сега, когато класът за свързване на View е настроен и готов за използване, е време действително да го използвате.

Да кажем съдържанието на some_layout.xml са нещо като следното:

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

Там има много идентификатори, които да се препратят в кода. Но докато имате инстанциран обвързващ клас, реферирането ще бъде лесно.

В Kotlin изгледите са посочени от променливи, съответстващи на техните ID, с някои промени. Долните черти се премахват и полученият низ е с камилска буква. Например за справка some_frame_layout от кода, който бихте използвали binding.someFrameLayout. The someFrameLayout променливата ще бъде екземпляр на FrameLayout.

val someFrameLayout: FrameLayout = binding.someFrameLayout

В Java изгледите се препращат от getter методи, съответстващи на техните идентификатори, с подобен формат на Kotlin. Например за справка some_frame_layout, бихте използвали binding.getSomeFrameLayout(). Методът ще върне екземпляр на FrameLayout.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

Препратките към View също са изравнени в обвързването. Рефериране inner_imageview е същото като рефериране some_frame_layout.

Заключение

Както съм сигурен, че можете да видите, View Binding в Android е едновременно лесен за изпълнение и лесен за използване. В много случаи е по-лесно да се използва от findViewById().

За повече подробности относно прилагането на View Binding, заедно с някои примери, вижте официалната документация на Google.