Intereting Posts
AWS Lambda Java / Kotlin Отправить сообщение для SQS Пользовательский вертикальный просмотрщик не работает с прослушивателем onClick в дочернем представлении Мне нужен способ динамически, progammaticaly изменить фон для ImageView в представлении Recycler Компиляция проекта Android с kotlin на TeamCity не удается изменять внешний класс через анонимный внутренний объект в котлине Firebase: чистый способ использования полей enum в Kotlin / Java? MQTT Android в режиме «Доза» (Android 7.0) RecyclerView – правильно внедрить удаление UNDO SnackBar (Kotlin) Как проверить генераторы для делегированных свойств? Создание Kotlin нового Gluon для разработчиков Java Mobile Vison API не обнаруживает QR-код Получение учета с использованием Anko SQLite в Котлине Почему универсальное типизированное свойство обнуляется? Есть ли способ идентифицировать класс данных Kotlin из обычного класса Kotlin? Программно сделать изображениеView видимым / невидимым с помощью переменной

Android support library 27, Fragment update?

Поскольку я обновил свой проект до версии SDK версии 27 и плагины градиента для библиотеки поддержки до версии 27.0.0 мне нужно было изменить свой код.

С 26.1.0 я могу просто использовать getContext()context Kotlin) в своем Fragment ( android.support.v4.app ), и у меня нет проблем с ошибкой, но поскольку я использую Kotlin, у меня проблема с версией 27.0.0 , все мои context вызовы больше не работали, мне нужен был оператор безопасности, например context!! , но поскольку я лично считаю, что это суета, чтобы делать это каждый раз, когда я только что сделал себя, я обходной функции

 override fun getContext() = super.getContext()!! 

Другое изменение (внезапно и именно поэтому я спрашиваю) – это методы onCreateView() и onViewCreated() . В onCreateView инфлятор больше не может быть нулевым, поэтому мне нужно было изменить свою подпись функции для правильного переопределения из onCreateView(inflater: LayoutInflater?...) в onCreateView(inflater: LayoutInflater...) и то же самое для параметра createdView в onViewCreated .

Так что теперь мне стало интересно, почему, особенно (для Kotlin) очень уродливое getContext() было внесено изменение и отправлено на https://developer.android.com/sdk/support_api_diff/27.0.0/changes.html .

Но подождите, видимо, они не изменили его? Итак, теперь мой вопрос в том, что я делаю что-то неправильно или если они действительно изменили его, и если да, то я могу спросить их, почему?

Кстати, то же самое относится к getActivity() , я думаю, что mHost == null check был добавлен, и метод getActivity даже окончательный, поэтому я не могу использовать мой обходной путь там, что делает его очень уродливым. На самом деле в исходных файлах методы выглядят одинаково, но 26.1.0 имеет Kotlin return type Context! и 27.0.0 возвращаемый тип Context? ,

    Это были преднамеренные изменения. Перед этой версией библиотеки поддержки эти классы не имели аннотаций с нулевым значением, поэтому из Котлина все эти типы были только типами платформ . В 27 они добавили необходимые аннотации, так что теперь эти типы определенно отмечены как NULL или NULL-значения в Kotlin – нет необходимости угадывать, могут ли они быть null .

    Что касается конкретных методов, о которых вы упомянули:

    • getActivity и getContext возвращают типы с getActivity значением, потому что, когда Fragment не привязан к Activity , эти методы уже возвратили null . Изменений в поведении нет, теперь он явно отмечен, поэтому вы можете спокойно справиться с этим.
    • Параметр onCreateView метода onCreateView использовался как тип платформы, поэтому вам было необходимо, чтобы вы отметили его как nullable или нет. Поскольку он никогда не будет вызываться с null , он был явно аннотирован как @NonNull , поэтому его тип в Kotlin теперь является строго LayoutInflater а не «более LayoutInflater! » LayoutInflater! тип.