На этом шаге мы рассмотрим настройку кнопки GENERATE.
Вы вывели характеристики персонажа, но в данный момент у пользователя нет возможности создать другого персонажа. Кнопку GENERATE нужно связать с логикой, которая выполнится после ее нажатия. Логика должна обновить характеристики персонажа и вывести результаты.
Добавьте эту логику в onCreate(), определив обработчик щелчков.
class MainActivity : AppCompatActivity() { private var characterData = CharacterGenerator.generate() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main) val binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) binding.generateButton.setOnClickListener { characterData = CharacterGenerator.generate() displayCharacterData(binding) } displayCharacterData(binding) } . . . . }
Рис.1. Настройка обработчика щелчков (NewCharacterActivity.kt)
В примере вы реализовали обработчик, который определяет, что сделать в ответ на касание кнопки. Запустите Samodelkin снова и нажмите кнопку GENERATE несколько раз. После каждого касания будет создаваться новый персонаж.
Метод setOnClickListener() ожидает аргумент, который реализует интерфейс OnClickListener. Он объявляет только один абстрактный метод - onClick. Подобные интерфейсы называют типами с единственным абстрактным методом (Single Abstract Method, SAM).
В более ранних версиях Java реализация обработчика щелчка потребовала бы использования анонимного встроенного класса:
generateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Сделать что-то } });
Kotlin поддерживает возможность преобразования типов с единственным абстрактным методом, которая позволяет передать в аргументе литерал функции вместо анонимного встроенного класса. Для взаимодействий с кодом на Java, требующим аргумента с реализацией SAM-интерфейса, Kotlin позволяет вместо традиционных анонимных встроенных классов использовать литералы функций.
Обратите внимание, что, заглянув в байт-код этого обработчика, вы увидите, что в нем используется анонимный встроенный класс, как в классическом коде Java в примере выше.
На следующем шаге мы рассмотрим cохранение состояния экземпляра.