Заявление об ограничении ответственности: я сотрудник Google, но взгляды, выраженные в этой статье, не совпадают с мнениями моего работодателя.

Kotlin и Android: эксперимент с латунными гвоздями, часть 5

Что ж, мы добрались до пятой части текущего еженедельного блога о моем опыте использования языка Kotlin® для полезных вещей при разработке Android. Если вы приземлились здесь случайно или неожиданно, возможно, вы хотели бы сначала перейти к одной из предыдущих частей и догнать нас, где мы сейчас находимся?

Часть 1 (настройка) | Часть 2 (здесь начинается код) | Часть 3 | Часть 4

На данный момент у нас есть довольно хороший способ выразить создание иерархии представлений Android с меньшим количеством нажатий клавиш, чем эквивалентный ресурс XML, и гораздо меньшим, чем эквивалент, написанный исключительно на языке Java®. Его синтаксис декларативен, вложение представлений очевидно, и мы знаем, как использовать функции расширения Kotlin для добавления удобных служебных функций по мере необходимости.

Но в прошлый раз мы оставили неловкую ситуацию при попытке установить левое заполнение представления. Вот как выглядит установка отступов в настоящее время. Обратите внимание, что мы должны вызвать setPadding () с его четырьмя аргументами вместо присвоения синтетическому свойству, производному от методов получения и установки в стиле JavaBeans:

Чтобы быть последовательным в этом коде построителя представлений, мы бы предпочли указать левое заполнение напрямую путем присваивания, а не вызывать метод с четырьмя параметрами. На первый взгляд, вы можете подумать об использовании другой функции расширения для присоединения метода расширения, называемого «setLeftPadding (int)», к классу View. Вы могли бы это сделать, но тогда вы не смогли бы на самом деле ссылаться на это как «leftPadding = dp_i (16)» в лямбда-выражении с получателем. Оказывается, функции-члены, которые выглядят как аксессоры в стиле JavaBeans, определенные в Kotlin, не преобразуются автоматически в синтетические свойства, такие как методы-члены, определенные в классах Java. Облом… но не совсем!

Вместо этого Kotlin также позволяет вам определять свойства расширения, которые допускают синтаксис, который выглядит так же, как синтетические свойства для методов класса Java, которые мы использовали до сих пор. Свойство расширения привязывается к существующему классу так же, как метод расширения Kotlin, поэтому вы можете получить к ним доступ в экземплярах этого класса, предполагая, что свойство расширения импортировано в ваш код.

Итак, что мы можем сделать, так это определить свойства расширения для установки значений заполнения в соответствии с другими синтетическими свойствами представления. Я просто покажу здесь одно свойство для левого отступа; остальные следуют их примеру:

Используя это свойство расширения «padLeft», наше предыдущее создание TextView теперь можно записать следующим образом:

Последовательность в назначении всех свойств. Отлично!

О свойстве расширения padLeft следует отметить несколько моментов:

  • Он использует синтаксис, аналогичный нотации «функция точки класса» для функций расширения, но теперь это «свойство точки класса».
  • Тип свойства указывается после двоеточия.
  • Он объявлен с использованием var, что в языке Котлина означает, что переменная или свойство изменяемые. Это означает, что мы можем присваивать значения непосредственно им. (С другой стороны, свойства val неизменяемы и доступны только для чтения.)
  • Свойство расширения, которое является изменяемым, требует, чтобы мы предоставили реализацию как для получения, так и для установки. (Аналогично, свойство неизменяемое требует только геттера).

Реализация padLeft setter определяется в терминах существующего метода setPadding () View. Он принимает значение, предоставленное с правой стороны выражения присваивания, и использует его в качестве первого параметра для setPadding () вместе со значениями синтетических свойств для других существующих значений заполнения TextView. Ниже установщика реализация padLeft getter просто определяется с использованием существующего синтетического свойства «paddingLeft» представления.

Боковое примечание: мне кажется несколько ироничным, что класс View в Android предоставляет геттеры в стиле JavaBeans для каждой метрики направленного заполнения, но не устанавливает. Ну что ж, мы исправили это с помощью свойств расширения!

Если вам когда-нибудь понадобится нечто большее от неподконтрольного вам API класса, просто добавьте то, что вы хотите, с помощью функций и свойств расширения Kotlin. 😃

Есть ли другие уловки Kotlin, которыми можно поделиться?

Есть еще пара простых приемов, которые можно использовать, чтобы еще больше уточнить синтаксис. Один прием позволяет избавиться от всех ссылок на «v» в выражениях построителя представлений, а другой упростит определение сложных параметров макета. Так что загляните в следующий раз, чтобы увидеть, как они работают!

Как обычно, вы можете подписаться на меня здесь, на Medium, а также в Twitter под именем CodingDoug, чтобы получать уведомления о следующей части этой серии. Надеюсь, вы сочли его полезным для изучения функций языка Kotlin, а также для изучения некоторых новых вещей о представлениях Android.