Intereting Posts
Если hashCode () возвращает уникальный идентификатор объекта Android Kotlin не может использовать list.sort () с lambda Как связать событие onClick из представления с помощью Android Binding Library и Kotlin? Подстановочный шаблон дженериков Котлина с расширением Невозможно создать класс объектов Android Room. Разница между методом takeWhile () и filter () в Котлине Относительные параметры макета в котлин Dokka – пропустить генератор javadoc для пакетов по умолчанию для Android Почему этот класс считается окончательным? Каков самый ранний уровень API Android, с которым я могу использовать Kotlin? Как начать второй наблюдаемый после получения результата от первого наблюдаемого в андроиде? COROUTINE_SUSPENDED и suspendCoroutineOrReturn в Котлине Операторы с нулевым значением, допустимые в общем классе? Низкая производительность анимации параметров макета в Android Я хочу получить один результат из другого списка

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 .