View Binding полегшує написання коду, який взаємодіє з представленнями. Ось як налаштувати це у вашому проекті Android Gradle.
Більшість розробників Android, мабуть, знайомі з класикою findViewById()
метод. Передайте йому ідентифікатор одного з представлень у вашому макеті XML, і він поверне посилання на розширену версію цього представлення. Це все за умови, що ви передали правильний ідентифікатор і що представлення дійсно існує. findViewById()
не має вбудованих перевірок, щоб запобігти спробам отримати представлення, яке ви не можете отримати. Введіть прив’язку перегляду.
Замість використання findViewById()
для кожного потрібного представлення View Binding автоматично генерує клас зв’язування для кожного макета XML. Кожне представлення з ідентифікатором автоматично додається до класу, тому ви можете посилатися на нього безпосередньо.
Додати прив’язку перегляду до проекту Android Gradle надзвичайно просто.
Налаштування Gradle
View Binding увімкнено на рівні модуля в Gradle. Якщо у вас є кілька модулів, вам потрібно буде ввімкнути їх окремо для кожного.
В android
блокувати на рівні вашого модуля build.gradle
, додайте опцію для ввімкнення прив’язки перегляду.
android {
...
buildFeatures {
viewBinding true
}
}
Може бути попередження про незаконний доступ, але це помилка ворсу, і її можна сміливо ігнорувати.
Синхронізуйте проект, і перегляд прив’язки буде ввімкнено. Це так просто.
Використання прив’язки перегляду
Існує кілька способів використання 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 на Views посилаються змінні, що відповідають їхнім ідентифікаторам, з деякими змінами. Підкреслення видаляються, і отриманий рядок має верблюжий регістр. Наприклад, для довідки some_frame_layout
з коду, який ви б використали binding.someFrameLayout
. The someFrameLayout
змінна буде екземпляром FrameLayout.
val someFrameLayout: FrameLayout = binding.someFrameLayout
У Java на Views посилаються методи отримання, які відповідають їхнім ID, у форматі, подібному до Kotlin. Наприклад, для довідки some_frame_layout
, ви б використали binding.getSomeFrameLayout()
. Метод поверне екземпляр FrameLayout.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Посилання на View також зведені в прив’язку. Посилання inner_imageview
те саме, що посилання some_frame_layout
.
Висновок
Як я впевнений, ви бачите, прив’язку перегляду в Android легко реалізувати та використовувати. У багатьох випадках його легше використовувати, ніж findViewById()
.
Щоб отримати додаткові відомості про впровадження зв’язування перегляду разом із деякими прикладами, перегляньте офіційну документацію Google.