kotlin – Как синтетическое свойство инициализирует представление?

Я использовал синтетическое свойство в своем коде. Но интересно, как и когда он фактически инициализирует каждый вид в Android.

Мы просто предоставляем импорт и доступ к каждому представлению по его идентификатору. Когда он выделяет память для объекта просмотра?

Это достаточно легко изучить, декомпилировав файл Kotlin, в котором вы используете Kotlin Android Extensions. (Вы можете сделать это, перейдя в Tools -> Kotlin -> Show Kotlin Bytecode а затем выберите Decompile в появившемся окне.) Короче говоря, это не волшебство, оно просто использует findViewById а затем бросает View на конкретный тип для вас ,

Если вы используете его внутри Activity или Fragment , они получают кеширование на Map так что поиск происходит только один раз. После этого вы платите только расходы на получение записи карты по идентификатору в качестве ключа.


Вы также можете использовать его в ViewGroup чтобы найти в нем ребенка с данным идентификатором, в этом случае кэширование отсутствует, эти вызовы заменяются простыми вызовами findViewById которые будут выполняться каждый раз, когда эта линия будет достигнута. Этот второй синтаксис выглядит примерно так:

 val view = inflater.inflate(...) view.btnLogin.text = "Login" 

И это переведёт на что-то похожее на это в бат-код:

 View view = inflater.inflate(...); Button btnLogin = (Button) view.findViewById(R.id.btnLogin); btnLogin.setText("Login"); 

Обратите внимание, что фактические экземпляры View все еще создаются, когда ваш макет раздувается. Kotlin Android Extensions – это только синтаксический сахар над вызовами findViewById .

Intereting Posts
Как создать таблицу SQLite с помощью Anko в Котине? Как установить значение свойства по умолчанию для Kotlin для `this` Как решить эту «нерешенную ссылку», когда я определил эту функцию? Объявление поля POJO, значение init или null Какой язык используется для шаблонов строк kotlin? Ион Котлин для работы с ненулевым объектом и непустым строковым представлением Ошибка подключаемого модуля Android kotlin TornadoFX: Стили CSS с другими библиотеками как работать со строками в Котлине и манипулировать струнами? Enum.valueOf в Котлине Почему небезопасный вызов .run () отлично работает при нулевом значении в Котлин? Kotlin – Ошибка: не удалось найти или загрузить основной класс _DefaultPackage IntellJ IDEA Плагин Kotlin – «нет доступных конфигураторов» IllegalArgumentException: параметр, заданный как непустой, равен null Могу ли я использовать имя лямбда в качестве параметра, переданного «вне круглых скобок»?