Как добавить привязку представления в проект Android Gradle

Привязка представлений упрощает написание кода, взаимодействующего с представлениями. Вот как настроить его в вашем проекте Android Gradle.

Большинство разработчиков Android, вероятно, знакомы с классической findViewById() метод. Передайте ему идентификатор одного из представлений в вашем макете XML, и он вернет ссылку на завышенную версию этого представления. Это все при условии, что вы передали правильный идентификатор и что представление действительно существует. findViewById() не имеет встроенных проверок, предотвращающих попытку получить представление, которое вы не можете получить. Введите привязку просмотра.

Вместо использования findViewById() для каждого желаемого представления View Binding автоматически генерирует класс привязки для каждого XML макета. Каждое представление с идентификатором автоматически добавляется в класс, поэтому вы можете ссылаться на них напрямую.

Добавить привязку представления в проект Android Gradle очень просто.

Настройка Gradle

Привязка просмотра включена на уровне модуля в Gradle. Если у вас несколько модулей, вам нужно будет включить его отдельно для каждого из них.

в android заблокировать на уровне вашего модуля build.gradle, добавьте возможность включить привязку просмотра.

android {
...

buildFeatures {
viewBinding true
}
}

Может быть предупреждение о несанкционированном доступе, но это ошибка, и ее можно смело игнорировать.

Синхронизируйте проект, и привязка просмотра будет включена. Это так просто.

Использование привязки представления

Существует несколько способов использования привязки представления, но прежде чем что-либо из этого произойдет, давайте поговорим о том, как генерируются классы привязки.

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

Допустим, у вас есть XML-макет с именем some_layout.xml. Соответствующий класс привязки будет называться SomeLayoutBinding. Этот шаблон справедлив для всех файлов.

Каждое слово (разделенное подчеркиванием в имени файла) будет написано с заглавной буквы, а подчеркивание будет удалено. Затем в конец добавляется «Привязка».

Создание экземпляра с существующим представлением

Если вы уже раздули файл макета и у вас есть ссылка на корень макета, вы можете указать классу привязки View использовать существующий макет.

Котлин:

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

Джава:

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

Джава:

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 */)

Джава:

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

Джава:

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

Джава:

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 на представления ссылаются переменные, соответствующие их идентификаторам, с некоторыми изменениями. Символы подчеркивания удаляются, и полученная строка имеет верблюжий регистр. Например, для ссылки some_frame_layout из кода, вы бы использовали binding.someFrameLayout. someFrameLayout переменная будет экземпляром FrameLayout.

val someFrameLayout: FrameLayout = binding.someFrameLayout

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

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

Ссылки на представления также сводятся в привязку. Ссылки inner_imageview то же самое, что ссылка some_frame_layout.

Заключение

Я уверен, вы можете видеть, что View Binding в Android легко реализовать и легко использовать. Во многих случаях его проще использовать, чем findViewById().

Дополнительные сведения о реализации привязки представления, а также некоторые примеры см. ознакомьтесь с официальной документацией Google.