Обращение к элементу фрагмента без поиска по id
Есть вот такой рабочий пример кода
// найти кнопку по id (тяжелая операция!!!!)
val rollButton: Button = findViewById(R.id.roll_button)
rollButton.text = "Let's Roll" // change buttons text
Взято с курса гугла. В качестве альтернативы тяжелой операции поиска по id предлагается использовать прослойку data binding
Вопрос в том, что в другом курсе встретил вот такой рабочий код:
override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)
button_login.setOnClickListener{ view : View ->
view.findNavController().navigate(R.id.action_login_to_account)
}
}
суть в том, что обработчик вешается на кнопку button_login (это ее id), хотя нигде явно нет поиска по id. Разве что, после вставки этого кода в импортах добавилось
import kotlinx.android.synthetic.main.fragment_login.*
Как тут произошел поиск кнопки ? Был какой то неявный поиск по id ?? Можно ли так писать в боевых проектах или это демонстрационный неоптимизированный пример ?
Спасибо
Ответы (1 шт):
В Kotlin есть чудесная штука: Kotlin Android Extensions. Одной из прелестей этих функций есть "Синтетики (Synthetic)". Суть этой штуки в том, что в любой View где вы можете вызвать метод findViewById() вы можете напрямую обращаться ко View по их id.
Под капотом вызывается все тот же findViewById() и никакой магии в этом нет, но все это делается за вас, уменьшая пачку однотипного кода".
Вот хорошая статья на эту тему.