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

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

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

Solutions Collecting From Web of "kotlin – Как синтетическое свойство инициализирует представление?"

Это достаточно легко изучить, декомпилировав файл 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 .