Шаг 254.
Основы Kotlin.
Первое Android-приложение на Kotlin. Настройка обработчика щелчков

    На этом шаге мы рассмотрим настройку кнопки GENERATE.

    Вы вывели характеристики персонажа, но в данный момент у пользователя нет возможности создать другого персонажа. Кнопку GENERATE нужно связать с логикой, которая выполнится после ее нажатия. Логика должна обновить характеристики персонажа и вывести результаты.

    Добавьте эту логику в onCreate(), определив обработчик щелчков.


Несмотря на то что в Android вы "нажимаете" элементы интерфейса пальцем, обработчик все равно называют обработчиком "щелчков".
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охранение состояния экземпляра.




Предыдущий шаг Содержание Следующий шаг