- Android Fragment Result Listener
- Как это работает?
- Как это выглядит в коде?
- Передача данных
- Получение данных
- Parent Fragment Manger
- Тестирование
- Передача данных
- Получение данных
- Вывод
- Работа с библиотеками KTX
- Обнаруживаемость
- Всегда импортируйте артефакт -ktx
- API платформы — core-ktx
- API Jetpack
- LiveData
- Activity / Fragment и ViewModel
- Room и WorkManager
- Другие модули KTX
- Android ktx with example – Fragment | Palette | Collection | SQLite
- 1. Fragment-ktx:
- 2. Palette-ktx:
- 3. SQLite-ktx:
- 4. Collection-ktx:
Android Fragment Result Listener
В Android передача данных между фрагментами может осуществляться разными способами: передача через родительскую Activity, используя ViewModel или даже Fragments API. Fragment Target API с недавних пор получил статус Deprecated и вместо него Google рекомендует использовать Fragment result API.
Что такое Fragment result API? Это новый инструмент от Google который позволяет передавать данные между фрагментами по ключу. Для этого используется FragmentManager, который в свою очередь реализует интерфейс FragmentResultOwner. FragmentResultOwner выступает в качестве центрального хранилища для данных, которые мы передаем между фрагментами.
Как это работает?
Как упоминалось выше, наш FragmentManager реализует интерфейс FragmentResultOwner, который хранит в себе ConcurrentHashMap . Эта HashMap хранит наши Bundle-ы по строковому ключу. Как только один из фрагментов подписывается (или уже подписан) то он получает результат по тому самому ключу.
Что важно знать:
- Если какой-либо фрагмент подписывается на результат методом setResultFragmentListener() после того, как отправляющий фрагмент вызовет setFragmentResult() , то он немедленно получит результат
- Каждую связку “Key + Result (Bundle)“ фрагмент получает только 1 раз
- Фрагменты которые находятся в бек стеке получат результат только после того как перейдут в состояние STARTED
- После того как фрагмент перейдет в состояние DESTROYED мы больше не сможем подписываться на ResultListener
Как это выглядит в коде?
Передача данных
Для передачи данных в другой фрагмент нам необходимо вызвать метод:
В параметры метода мы кладем ключ, который и будет нашим идентификатором для получения данных и сам Bundle. Этот Bundle будет содержать в себе передаваемые данные.
Получение данных
Для получения данных через FragmentManager мы регистрируем наш FragmentResultListener и задаем ключ по которому мы будем получать данные. Тот самый ключ который мы указывали в методе FragmentManager.setFragmentResult()
Здесь мы видим 2 аргумента: key: String и bundle: Bundle.
Первый — это тот самый ключ, по которому мы передаем сюда данные. Второй — Bundle, в котором лежат переданные данные.
Parent Fragment Manger
Выбор FragmentManager-а для передачи данных между фрагментами зависит от принимающего фрагмента:
- Если оба фрагмента находятся в одном и том же FragmentManager (например оба фрагмента находятся в Activity), то мы должны использовать родительский FragmentManager, который хранит в себе Activity
- Если у нас один фрагмент вложен в другой фрагмент, то для передачи данных мы используем childFragmentManager (он же родительский фрагмент для принимающего фрагмента)
Важно понимать, что наш FragmentResultListener должен находиться в общем для двух фрагментов FragmentManager-е.
Тестирование
Для тестирования отправки/получения данных через FragmentResultListener, мы можем использовать FragmentScenario API, который предоставляет нам все преимущества тестирования фрагментов в изоляции.
Передача данных
Как мы можем протестировать, что наш фрагмент корректно отправляет данные через родительский FragmentManager? Для этого нам необходимо внутри теста отправить результат и проверить, что наш FragmentResultListener получил корректные данные:
Получение данных
Для проверки корректности получения данных мы можем симулировать отправку данных, используя родительский FragmentManager. Если в отправляющем фрагменте корректно установлен FragmentResultListener мы должны получить корректные данные проверяя сам листенер или последствие их получения.
Вывод
В данный момент FragmentResultListener находится в альфе, а это значит что возможно еще будут изменения со стороны Google. Но уже сейчас видно, что это достаточно крутой инструмент, для передачи данных между фрагментами, не создавая дополнительных интерфейсов и классов. Единственным нюансом остается, пожалуй то, что не совсем понятно, как и где лучше хранить ключи где, но это не кажется таким уж большим минусом.
Для того чтоб получить возможность использовать FragmentResultListener нам нужно подключить в зависимостях версию фрагментов 1.3.0-alpha04 или новее:
Источник
Работа с библиотеками KTX
Когда вы используете Android Java API в Kotlin, к вам достаточно быстро приходит понимание, что вам не хватает некоторых фич Kotlin, которые делают написание кода намного проще и приятнее. Вместо того, чтобы писать свои собственные обертки и функции расширения для этих API, я рекомендую вам обратить внимание на набор библиотек Jetpack KTX. В настоящее время более 20 библиотек имеют собственную KTX версию, создающую прекрасные идиоматические версии Java API, начиная от API платформы Android до ViewModels, SQLite и даже Play Core. В этой статье мы рассмотрим некоторые из доступных нам API и заглянем под капот, чтобы увидеть, как они были созданы.
Если вы предпочитаете чтению просмотр видео, вы можете ознакомиться с материалом этой статьи здесь:
Обнаруживаемость
Чтобы повысить обнаруживаемость функциональности ktx , рекомендуется всегда импортировать артефакт -ktx , если он доступен. Поскольку артефакт -ktx транзитивно зависит от не-ktx версии, вам не нужно включать другой артефакт. Например, для viewmodel у вас есть 2 артефакта: viewmodel и viewmodel-ktx . Артефакт -ktx будет содержать расширения Kotlin:
Всегда импортируйте артефакт -ktx
Для расширений API платформы Android следует импортировать артефакт core-ktx .
Большинство функций ktx реализовано как функции расширения, поэтому вы сможете легко найти их с помощью автокомплита в Android Studio.
Другие функции, такие как деструктуризация и перегрузка операторов, доступные в таких классах, как Color, можно обнаружить в списке расширений KTX.
API платформы — core-ktx
core-ktx обеспечивает идиоматическую функциональность Kotlin для API платформы Android.
Например, если вы работаете с SharedPreferences , когда вам нужно обновить значение, вместо выполнения трех разных вызовов вы можете обойтись всего одним:
Под капотом метод edit ktx вызывает ту же функциональность, по умолчанию предоставляя лучшую альтернативу commit — apply() . apply () , в отличие от commit() , фиксирует изменения на диске асинхронно:
В core-ktx вы также можете найти более простой способ работы с часто используемыми листнерами платформы. Например, если вы хотите триггерить экшн по изменению текста в EditText , вам придется реализовать все методы TextWatcher , даже если вас интересует только onTextChanged() . core-ktx создает соответствующие методы TextWatcher : doOnTextChanged, doAfterTextChanged и doBeforeTextChanged, но в вашем коде Kotlin вы просто используете тот, который вам нужен:
Это дает несколько преимуществ: ваш код становится читабельнее, поскольку он лаконичнее, и вы получаете лучшие аннотации именования и nullability .
Под капотом doOnTextChanged реализован как функция расширения TextView — класса, который также имеет метод addTextChangedListener . doOnTextChanged создает пустые реализации для других функций TextWatcher .
API Jetpack
Большинство доступных расширений предназначены для API Jetpack. Здесь я просто рассмотрю некоторые из тех, которыми я пользовался чаще всего.
LiveData
Львиная доля функциональности LiveData также реализовано в виде функций расширения: такие методы как map, switchMap или distinctUntilChanged (источник).
Например, использование map из liveData-ktx избавляет нас от необходимости вызывать Transformations.map(liveata) < /* map function */ >и позволяет нам напрямую вызывать liveData.map более идиоматическим способом в духе Kotlin.
Когда вы наблюдаете за объектом LiveData , вам необходимо реализовывать Observer. Но с использованием метода observe из lifecycle-ktx код становится намного проще. Убедитесь, что вы вызываете импорт androidx.lifecycle.observe , если метод не найден.
LiveData идеально подходит для предоставления данных, которые будут использоваться пользовательским интерфейсом, поэтому для преобразования из Flow в LiveData и из LiveData в Flow , артефакт lifecycle-livedata-ktx предоставляет две удобных функций расширения: Flow.asLiveData() и LiveData.asFlow().
Activity / Fragment и ViewModel
Чтобы создать ViewModel , вы должны расширить класс ViewModel и реализовать ViewModelProvider.Factory, если ваша ViewModel имеет зависимости. Чтобы создать ее инстанс, используйте делегат viewModels (подробнее о делегатах вы можете почитать здесь): by viewModels(factory) :
viewModels доступен в артефакте -ktx activity и fragment .
При работе с корутинами вы столкнетесь с необходимостью запускать корутину в ViewModel . Работа, выполняемая корутиной, должна быть отменена при уничтожении ViewModel . Вместо реализации своего собственного CoroutineScope , используйте viewModelScope. Отмена будет произведена автоматически в ViewModel.onCleared(). Вы можете узнайте больше о тонкостях viewModelScope в этой статье.
Room и WorkManager
И Room, и WorkManager предлагают поддержку корутин через свои артефакты -ktx . Поскольку мы считаем, что об этом стоит рассказать более подробно, следите за обновлениями статей MAD Skills, посвященных этим библиотекам!
Другие модули KTX
Артефакты AndroidX — не единственные, кто предоставляет KTX версии:
Google Maps предлагают Maps и Places библиотеки ktx
В Play Core есть артефакт core-ktx, обеспечивающий поддержку корутин для мониторинга обновлений в приложении
Лаконичность, удобочитаемость и Kotlin-идиоматичность — это фичи, которые принесут пользу вашему коду, как только вы начнете использовать -ktx расширения. Следите за новостями, чтобы узнать о других способах использовать Kotlin и Jetpack в своем приложении!
Приглашаем также на открытые вебинары:
• «Крестики-нолики на минималках» — игра на Android менее чем за 2 часа.
• «Рисуем свой график котировок в Android»:
— Рассмотрим основные инструменты для рисования
— Изучим возможности классов Canvas, Path, Paint
— Нарисуем кастомизируемый график котировок и добавим в него анимации
Источник
Android ktx with example – Fragment | Palette | Collection | SQLite
If you’re developing an Android application with Kotlin, then I have good news for you. Recently Google released an Android ktx library, which is a set of Kotlin Extension function. Android ktx is a part of Jetpack family. The purpose of Android ktx is to write less code and more concise. Android ktx brings us lots of extension functions, named parameters, lambdas, and parameter with the default value. It does not add any new features to existing Android Api’s.
I read all the documentation on android-ktx and thought to write some notes on it. It’s not just reading on Android developer documentation. We’re going to see the extension functions with example and explore most of them.
Note: Android ktx is currently in preview mode but it is open for the developer to give it a try and give feedback to contributors. It may be offering more extension functions when it is released.
To get started with Android ktx add the google repository in build,gradle file.
Android ktx dependency in split into the modular approach. By modular means, you don’t have to add the core dependency, if you do not want to use all of the extension’s functions. Here is the list of dependency of Android ktx.
After syncing the project you’re good to go to use Android ktx. Now let’s start with the first modular dependency.
1. Fragment-ktx:
Fragment ktx dependency right now supports only one extension function. The only extension function is about triggering the fragment transaction. Without ktx performing a fragment transaction, the transaction requires starting a transaction triggering an action like replacing or adding a fragment and then the signing on one of the four commit methods. Now let’s see how we can remove the boilerplate code with fragment ktx extension.
Fragment ktx as the transaction extension function to the FragmentManager class removing all the begin transaction boilerplate code. As well as providing the four value for sync and stateless that you can easily override.
now | allowStateLoss | Method |
false | false | commit() |
false | true | commitAllowingStateLoss() |
true | false | commitNow() |
true | true | commitNowAllowingStateLoss() |
2. Palette-ktx:
Like I said the library is currently in the preview that’s why we only have two extension function for palette ktx. Now let’s take a look at what extension function we have…?
Now you can easily create Palette. Builder with the bitmap.
You can easily get Palette. Swatch from Palette class.
Returns the selected swatch for the given Target from the palette, or if null one could not be found. With palette swatch, you can retrieve RGB colour by calling the getRgb method.
3. SQLite-ktx:
SQLite ktx dependency right now supports only one extension function. When implementing database transaction you need a lot of boilerplate code, with the SQLite ktx, you can focus on what matters the operation that you want to make in the database. Let’s see an example of handling transaction with sqlLite ktx.
If you setting exclusive to true it called beginTransaction and when setting false it called beginTransactionNonExclusive.
4. Collection-ktx:
If you use the Kotlin top-level function of creating collection then you absolutely love this collection ktx dependency. It supports many extension functions and it also supports the top-level function of creating the collection. Let’s see them one by one.
4.1 Collection-ktx Top-level Functions:
With the .collection package of ktx, you can easily create an arrayMapOf with top-level function to create ArrayMap.
You can also give a list of Pair where the first component is the key and second component is the value.
The ArraySet also gives some top-level function to ease the process when working with them.
You can also give a vararg to create ArraySet.
4.2 Collection-ktx Extension Functions:
When working with the LongSparseArray and SparseArrayCompat we can make use of the below extension function. Both of the classes pretty much offers the same functionalities.
That’s it guy’s, I’m going to end this blog here for more further reading about Android ktx see the part 2. In the next part, I’m going to explain about lifecycle ktx, reactive streams ktx and runtime ktx. Finally, in the third part, we’re gonna explore the core ktx.
I hope you guy’s have learned something from this post. If you’ve any queries about this post please do comment below.
Thank you for being here and keep reading.
Disclosure of Material Connection: Some of the links in the post above are “affiliate links.” This means if you click on the link and purchase the item, we will receive an affiliate commission. Regardless, we only recommend products or services we use personally and believe will add value to our readers.
Источник