Часто вижу, как какой-то простой функционал делают через ж… неправильно, будь то верстка или какие-то участки кода и т.д.. Решил такие штуки с разбором иногда постить на канале.
Сегодня про верстку.
Довольно популярный кейс, встречается наверное в каждом приложении. Нужно показать какой-нибуь текст с иконкой перед ним или после него. Казалось бы всё просто, НО, очень часто встречаю верстку из 2-ух вьюх 🤦♂️. Выглядит это так: TextView + ImageView. Капец как меня такое бесит.
Ну зачем так делать, если можно обойтись одним
И да, программно тоже можно задать иконку для
Вывод: не нужно изобретать велосипед, используйте компоненты по назначению и пользуйтесь функциями, которые уже есть в SDK.
Сегодня про верстку.
Довольно популярный кейс, встречается наверное в каждом приложении. Нужно показать какой-нибуь текст с иконкой перед ним или после него. Казалось бы всё просто, НО, очень часто встречаю верстку из 2-ух вьюх 🤦♂️. Выглядит это так: TextView + ImageView. Капец как меня такое бесит.
Ну зачем так делать, если можно обойтись одним
TextView, там же есть нужный функционал для такого кейса drawableEndCompat/drawableStartCompat. Так нет, нужно нагородить дополнительно ImageView, а потом еще в коде добавить логики по отображение и т.д.И да, программно тоже можно задать иконку для
TextView, например через TextViewCompat.setCompoundDrawablesRelative()Вывод: не нужно изобретать велосипед, используйте компоненты по назначению и пользуйтесь функциями, которые уже есть в SDK.
👍57👎32🔥6🤔4
Jetpack Compose for Android Developers
Курсы от гугла по использованию Jetpack Compose.
👉 Compose essentials
👉 Layouts, theming, and animation
👉 Architecture and state
👉 Accessibility, testing, and performance
👉 Form factors
Курсы от гугла по использованию Jetpack Compose.
👉 Compose essentials
👉 Layouts, theming, and animation
👉 Architecture and state
👉 Accessibility, testing, and performance
👉 Form factors
👍19🥰3
Фреймворк для мобильных приложений DivKit
Статья от Яндекса, про их новый опенсорсный фреймворк DivKit, с разбором возможностей на примерах. Инструмент позволяет внедрить подход server-driven UI второго поколения, то есть не просто описывать параметры блоков интерфейса с сервера, но и управлять всей версткой.
Код на GitHub → DivKit
Читать (Ru)
Статья от Яндекса, про их новый опенсорсный фреймворк DivKit, с разбором возможностей на примерах. Инструмент позволяет внедрить подход server-driven UI второго поколения, то есть не просто описывать параметры блоков интерфейса с сервера, но и управлять всей версткой.
Код на GitHub → DivKit
Читать (Ru)
💩24👍9🔥2
Testing Composable in Jetpack Compose Android
Пятая часть из цикла статей "Android Testing Fundamentals", в которой рассказывается как тестировать Composable в Jetpack Compose.
👉 Creating a Composable
👉 Setting up the test environment
👉 Writing test cases
Читать (En)
Пятая часть из цикла статей "Android Testing Fundamentals", в которой рассказывается как тестировать Composable в Jetpack Compose.
👉 Creating a Composable
👉 Setting up the test environment
👉 Writing test cases
Читать (En)
👍7
Почему я больше не буду использовать deep linking из Navigation Component
Если еще не читали статью про deep linking из Navigation Component, обязательно почитайте. Там про некоторые недостатки с которыми ребята солкнулись при работе с deep linking из navigation component.
Сам я диплинки из navigation component еще не юзал, но выглядит это так, как будто лучше написать свой handler, это будет более гибким вариантом и более настраевым в поведении.
Это уже не первая статья, на эту тему, вот еще несколько.
👉 Navigation Component-дзюцу, vol. 3 — Corner-кейсы
👉 Как мы внедряли навигацию из Jetpack в боевое приложение. Доклад Яндекс.Еды
Читать (Ru)
Если еще не читали статью про deep linking из Navigation Component, обязательно почитайте. Там про некоторые недостатки с которыми ребята солкнулись при работе с deep linking из navigation component.
Сам я диплинки из navigation component еще не юзал, но выглядит это так, как будто лучше написать свой handler, это будет более гибким вариантом и более настраевым в поведении.
Это уже не первая статья, на эту тему, вот еще несколько.
👉 Navigation Component-дзюцу, vol. 3 — Corner-кейсы
👉 Как мы внедряли навигацию из Jetpack в боевое приложение. Доклад Яндекс.Еды
Читать (Ru)
👍10👎2
В Google Play разрешили использовать сторонние способы оплаты в РФ
Вчера ближе к ночи во многих источниках появилась новость "Google разрешил пользователям из РФ применять альтернативные способы оплаты покупок". Посмотрел несколько источников и никаких точной инфы там не увидел. Пошёл смотреть Support - Play Console.
И вот что там написано
"Начиная со 2 августа 2022 г., положения правил Google Play в отношении платежей, требующие использования платежной системы Google Play, не применяются к разработчикам, распространяющим приложения через Google Play, требующим или принимающим платежи от пользователей в России в данный период времени."
Похоже, что все таки реально разрешили сторонние способы оплаты на период блокировки.
👉 Изменения в платежной системе Google Play
👉 Платежи
Вчера ближе к ночи во многих источниках появилась новость "Google разрешил пользователям из РФ применять альтернативные способы оплаты покупок". Посмотрел несколько источников и никаких точной инфы там не увидел. Пошёл смотреть Support - Play Console.
И вот что там написано
"Начиная со 2 августа 2022 г., положения правил Google Play в отношении платежей, требующие использования платежной системы Google Play, не применяются к разработчикам, распространяющим приложения через Google Play, требующим или принимающим платежи от пользователей в России в данный период времени."
Похоже, что все таки реально разрешили сторонние способы оплаты на период блокировки.
👉 Изменения в платежной системе Google Play
👉 Платежи
👎23👍18👏1🤔1🤡1
MVI for Compose
Еще одна серия статей про организацию MVI для Compose. Разбираются некоторые особенности MVVM, чем отличаюется MVI от MVVM, ну и примеры кода и best practices.
👉 Part 1 – Problems and benefits of MVVM
👉 Part 2 – Custom MVI
👉 Part 3 – Practical examples, continued implementation
👉 Part 4 – Automating / Reducing boilerplate
👉 Part 5 – Best practices and conclusions
Еще одна серия статей про организацию MVI для Compose. Разбираются некоторые особенности MVVM, чем отличаюется MVI от MVVM, ну и примеры кода и best practices.
👉 Part 1 – Problems and benefits of MVVM
👉 Part 2 – Custom MVI
👉 Part 3 – Practical examples, continued implementation
👉 Part 4 – Automating / Reducing boilerplate
👉 Part 5 – Best practices and conclusions
👍17
Глубокое погружение в Java Memory Model
Недавно смотрел очередной публичный собес и там поверхностно поднималась тема Java Memory Model.
Подумал, что нужно погуглить толковых материалов на этот счет и освежить память, а сегодня как раз на глаза попалась огненая статья про JMM с детальным разбором.
👉 Memory ordering
👉 Data race
👉 Happens-before
👉 Volatile
👉 Cache coherence
Однозначно в избранное ✅
Читать (Ru)
Недавно смотрел очередной публичный собес и там поверхностно поднималась тема Java Memory Model.
Подумал, что нужно погуглить толковых материалов на этот счет и освежить память, а сегодня как раз на глаза попалась огненая статья про JMM с детальным разбором.
👉 Memory ordering
👉 Data race
👉 Happens-before
👉 Volatile
👉 Cache coherence
Однозначно в избранное ✅
Читать (Ru)
🔥24👍3
Algorithms and Design Patterns
Сразу несколько полезных материалов по алгоритмам. В первом собраны наиболее распространенные алгоритмы, структуры данных и паттерны проектирования на Kotlin. Второй – онлайн сервис, с множеством статей по различным алгоритмам, структурам и т.д.
👉 Kotlin Algorithms and Design Patterns
👉 Алгоритмика
Сразу несколько полезных материалов по алгоритмам. В первом собраны наиболее распространенные алгоритмы, структуры данных и паттерны проектирования на Kotlin. Второй – онлайн сервис, с множеством статей по различным алгоритмам, структурам и т.д.
👉 Kotlin Algorithms and Design Patterns
👉 Алгоритмика
🔥18👍6
Android Access Token Logic With Retrofit OkHttp Interceptors
Пример реализации обновления токена (OAuth) через OkHttp Interceptors. В целом довольно стандартная реализация, но вдруг кому-то понадобится.
Читать (En)
Пример реализации обновления токена (OAuth) через OkHttp Interceptors. В целом довольно стандартная реализация, но вдруг кому-то понадобится.
Читать (En)
👍24👎1🔥1👏1
Как работа с ресурсами вызывает микрофризы
Достаточно интересная и полезная статья про микрофризы при работе с ресурсами, а именно Drawable. Приводится несколько вариантов, как этого можно избежать.
Ну и как всегда, по большей части речь идет про списки 💪
Читать (Ru)
Достаточно интересная и полезная статья про микрофризы при работе с ресурсами, а именно Drawable. Приводится несколько вариантов, как этого можно избежать.
Ну и как всегда, по большей части речь идет про списки 💪
Читать (Ru)
👍25😁1
Продолжаю тему небольших постов с разбором простых вещей, сделанных неочевидно. Предыдущий пост тут.
Сегодня про UX/UI, а именно про различные состояния у кликабельных вьюшек (state_pressed, state_enable).
Кейс 1 - state_pressed. Иногда пользуясь некоторыми приложениями, замечаю такую штуку: нажимаю какую-нибудь кнопку или иконку и состояние элемента никак не меняется.
Почему так происходит?
Иногда разработчики делают кликабельными компоненты отличные от Button, ImageButton и т.д., например TextView, ImageView, различные Layout`s или кастомные вьюшки, но соответствующий бэкграунд для них не устанавливают. Как мы с вами знаем, бэкграунд можно задавать через xml drawable, в котором мы предварительно описываем нужные стейты. Для Button`s это уже заложено системой, у других компонентов нет.
Это всё можно сделать элементарно и просто, но по каким-то причинам некоторые разработчики этого не делают…
Так вот, если вы делаете кликабельными такие компоненты – используйте хотя бы готовые, системные drawable, это на 1 строчку кода больше, а получится нормальный кликабельный с ripple эффектом компонент и приложение будет более юзерфрендли 😉
Вот как можно задать некоторые системные drawable
1. android:background="?android:attr/selectableItemBackground" – для текстовых кнопок
2. android:background="?android:attr/selectableItemBackgroundBorderless" – для текстовых кнопок
3. style="?attr/toolbarNavigationButtonStyle" – для иконок
Кейс 2 – state_enable
Не давно формировал счет в приложении "Налог" и у них в это время были технические работы на бэке. При нажатии на кнопку "Выдать счет" ничего не происходит, я тыкаю еще раз – тоже самое и так было N-количество раз… По итогу удалось сформировать счет – вроде всё ок. Через несколько дней увидел, что одинаковых счетов сформировалось штук 15 😳. Я конечно же не нужные аннулировал, но давайте разберёмся почему так могло произойти.
1. Не было состояния загрузки (progress_bar, progress_view)
2. Кнопка была всегда активной
Как решать подобное?
Для асинхронных функций (особенно для критично важных) на время выполнения нужно показывать состояние загрузки и дизейблить кнопку. Больше наверное тут и добавить нечего)
Сегодня про UX/UI, а именно про различные состояния у кликабельных вьюшек (state_pressed, state_enable).
Кейс 1 - state_pressed. Иногда пользуясь некоторыми приложениями, замечаю такую штуку: нажимаю какую-нибудь кнопку или иконку и состояние элемента никак не меняется.
Почему так происходит?
Иногда разработчики делают кликабельными компоненты отличные от Button, ImageButton и т.д., например TextView, ImageView, различные Layout`s или кастомные вьюшки, но соответствующий бэкграунд для них не устанавливают. Как мы с вами знаем, бэкграунд можно задавать через xml drawable, в котором мы предварительно описываем нужные стейты. Для Button`s это уже заложено системой, у других компонентов нет.
Это всё можно сделать элементарно и просто, но по каким-то причинам некоторые разработчики этого не делают…
Так вот, если вы делаете кликабельными такие компоненты – используйте хотя бы готовые, системные drawable, это на 1 строчку кода больше, а получится нормальный кликабельный с ripple эффектом компонент и приложение будет более юзерфрендли 😉
Вот как можно задать некоторые системные drawable
1. android:background="?android:attr/selectableItemBackground" – для текстовых кнопок
2. android:background="?android:attr/selectableItemBackgroundBorderless" – для текстовых кнопок
3. style="?attr/toolbarNavigationButtonStyle" – для иконок
Кейс 2 – state_enable
Не давно формировал счет в приложении "Налог" и у них в это время были технические работы на бэке. При нажатии на кнопку "Выдать счет" ничего не происходит, я тыкаю еще раз – тоже самое и так было N-количество раз… По итогу удалось сформировать счет – вроде всё ок. Через несколько дней увидел, что одинаковых счетов сформировалось штук 15 😳. Я конечно же не нужные аннулировал, но давайте разберёмся почему так могло произойти.
1. Не было состояния загрузки (progress_bar, progress_view)
2. Кнопка была всегда активной
Как решать подобное?
Для асинхронных функций (особенно для критично важных) на время выполнения нужно показывать состояние загрузки и дизейблить кнопку. Больше наверное тут и добавить нечего)
👍36
Опыт перехода на MVI в Android на базе собственного решения
И снова про MVI. В статье ребята из Юлы делятся опытом перехода на MVI на базе собственного решения – Reduktor.
Рассмативаются базовые штуки, типа отличий MVP/MVVM/MVI, ну и про то, как пришли к собственному решению.
Библиотека на GitHub → Reduktor
Читать (Ru)
И снова про MVI. В статье ребята из Юлы делятся опытом перехода на MVI на базе собственного решения – Reduktor.
Рассмативаются базовые штуки, типа отличий MVP/MVVM/MVI, ну и про то, как пришли к собственному решению.
Библиотека на GitHub → Reduktor
Читать (Ru)
👍7💩4
10 Almost Unknown Tools Which Facilitate Android Apps Development
Еще один сборник c тулзами, которые могут облегчить жизнь Android-разработчикам и ускорить процесс разработки.
Читать (En)
Еще один сборник c тулзами, которые могут облегчить жизнь Android-разработчикам и ускорить процесс разработки.
Читать (En)
🔥17🌚3
This media is not supported in your browser
VIEW IN TELEGRAM
Extending SwipeToDismiss in Jetpack Compose
Простенький пример кастомизации SwipeToDismiss в Jetpack Compose.
Код на GitHub → SwipeDismiss
Читать (En)
Простенький пример кастомизации SwipeToDismiss в Jetpack Compose.
Код на GitHub → SwipeDismiss
Читать (En)
👍7
Stop using MVVM with SwiftUI
Давненько не было на канале материалов по iOS, нужно это исправлять 😎
Статья про то, почему использование MVVM в связке с SwiftUI плохая затея.
Читать (En)
Давненько не было на канале материалов по iOS, нужно это исправлять 😎
Статья про то, почему использование MVVM в связке с SwiftUI плохая затея.
Читать (En)
👍8👎3🔥1😁1
A cleaner way to interact between Composable and ViewModel in Jetpack Compose
Пример более чистого взаимодействия между Composable и ViewModel в Jetpack Compose, через единый класс для UI стейтов и Sealed Class для ивентов.
Кажется, что данный подход никак не привязан к UI стилю (Jetpack Compose / Xml), а больше про взаимодействие View слоя с ViewModel. Поэтому, Jetpack Compose в принципе отсюда можно 😉
Читать (En)
Пример более чистого взаимодействия между Composable и ViewModel в Jetpack Compose, через единый класс для UI стейтов и Sealed Class для ивентов.
Кажется, что данный подход никак не привязан к UI стилю (Jetpack Compose / Xml), а больше про взаимодействие View слоя с ViewModel. Поэтому, Jetpack Compose в принципе отсюда можно 😉
Читать (En)
👍11
Deep Dive Into Deep Link. Часть 1. Введение и исходная задача
Первая, вводная часть из серии статей про Deep Link.
👉 Что такое Deep Link
👉 Android App Link
👉 Как работают Deep Link на разных устройствах.
Читать (Ru)
Первая, вводная часть из серии статей про Deep Link.
👉 Что такое Deep Link
👉 Android App Link
👉 Как работают Deep Link на разных устройствах.
Читать (Ru)
👍10
Concurrency in iOS: GCD
Пока по андроиду не попадаются интересные материалы, предлагаю почитать статейку не тему Concurrency в iOS.
👉 Introduction to Concurrency
👉 Concurrency in iOS
👉 Grand Central Dispatch
👉 DispatchQueue
👉 DispatchWorkItem
👉 Concurrency Problem
Читать (En)
Пока по андроиду не попадаются интересные материалы, предлагаю почитать статейку не тему Concurrency в iOS.
👉 Introduction to Concurrency
👉 Concurrency in iOS
👉 Grand Central Dispatch
👉 DispatchQueue
👉 DispatchWorkItem
👉 Concurrency Problem
Читать (En)
🔥5👍3
Что мы используем для анализа Android-приложений
Крутая статья, с набором инструментов для анализа Android-приложений. Для удобства, вынес ссылки на некоторые инструменты в пост.
👉 BurpSuite
👉 MitmProxy
👉 OWASP ZAP
👉 JADX
👉 Apktool
👉 ByteCode Viewer
👉 Androguard
👉 Mariana Trench
👉 Hbctool
👉 Frida
👉 Objection
👉 MagiskTrustUserCerts
👉 WebViewDebugHook
Однозначно в избранное ✅
Читать (Ru)
Крутая статья, с набором инструментов для анализа Android-приложений. Для удобства, вынес ссылки на некоторые инструменты в пост.
👉 BurpSuite
👉 MitmProxy
👉 OWASP ZAP
👉 JADX
👉 Apktool
👉 ByteCode Viewer
👉 Androguard
👉 Mariana Trench
👉 Hbctool
👉 Frida
👉 Objection
👉 MagiskTrustUserCerts
👉 WebViewDebugHook
Однозначно в избранное ✅
Читать (Ru)
🔥18👍4
Новый канал в семействе Native – QA Native 😎
Давно в планах было создать еще несколько тематических каналов, таким образом еще в январе я забронировал линк в ТГ – @qa_native и начал потихоньку накидывать туда материалы.
Сегодня разгрузил какую-то часть интересного и полезного избранного материала и предлагаю подписаться тем, кому интересна тема QA, тестирования, автоматизации и т.д.
Для тех, кто не знает, когда-то давно я сам начинал в IT с обычного тестировщика, поэтому в этой теме я тоже разбираюсь на достаточном уровне.
Присоединяйтесь → @qa_native
P.S. Следите за новостями, еще есть несколько линков забронированных 😉
Давно в планах было создать еще несколько тематических каналов, таким образом еще в январе я забронировал линк в ТГ – @qa_native и начал потихоньку накидывать туда материалы.
Сегодня разгрузил какую-то часть интересного и полезного избранного материала и предлагаю подписаться тем, кому интересна тема QA, тестирования, автоматизации и т.д.
Для тех, кто не знает, когда-то давно я сам начинал в IT с обычного тестировщика, поэтому в этой теме я тоже разбираюсь на достаточном уровне.
Присоединяйтесь → @qa_native
P.S. Следите за новостями, еще есть несколько линков забронированных 😉
🔥7👍2