Android Developer @android_dev_ru Channel on Telegram

Android Developer

@android_dev_ru


Топовый канал для Android разработчиков!

Android Developer (Russian)

Добро пожаловать в канал Android Developer! Здесь вы найдете все необходимые ресурсы, советы и инструменты для успешной разработки приложений под Android. Наш канал предназначен для опытных специалистов и начинающих разработчиков, которые хотят улучшить свои навыки и быть в курсе последних тенденций в мире разработки мобильных приложений. В нашем канале android_dev_ru вы сможете найти обзоры новых библиотек, туториалы, видеоуроки, а также участвовать в обсуждениях с коллегами по цеху. Мы стремимся создать сообщество, где каждый сможет найти ответы на свои вопросы, поделиться опытом и получить поддержку от других разработчиков. Присоединяйтесь к нам прямо сейчас и станьте частью профессионального сообщества Android разработчиков!

Android Developer

16 Oct, 06:27


Топ плагинов для Android Studio

1. Kotlin Fill Class — фантастический плагин, который делает разработку намного более приятной и быстрой. С его помощью вы можете заполнять классы и функции на лету.

2. ADB Idea — это дополнение к ADB, которое вы можете запустить с помощью всплывающего окна.

3. Key Promotex X — поможет вам освоить основные сочетания клавиш во время работы. Когда вы нажимаете мышью на кнопку в среде IDE, Key Promoter X показывает сочетание клавиш, которое вы должны были использовать вместо этого.

4. IdeaVim — это Vim в Android Studio. Вы можете настроить его по своему вкусу с помощью файла .ideavimrc в вашем домашнем каталоге, как если бы вы использовали .vimrc.

@android_dev_ru #android

Android Developer

15 Oct, 15:49


🖥 Duress

Приложение с открытым исходным кодом Duress, наспинное на Kotlin, помогает следить за безопасностью вашего устройства.

Оно позволяет установить специальный пароль принуждения, который можно использовать при угрозе безопасности. Если кто-то попытается заставить вас разблокировать телефон, просто введите этот пароль.

После этого Duress автоматически отправит уведомление выбранным контактам, чтобы они знали, что вам нужна помощь.

🖥 Github: https://github.com/x13a/Duress
👩‍💻F-droid: https://f-droid.org/en/packages/me.lucky.duress/

@android_dev_ru #android

Android Developer

13 Aug, 05:51


Как получить ссылку на фрагмент из активити?

Отвечая на этот вопрос, не рассказывайте, пока не спросят, об использовании в активити объекта List<MyFragment>, в который вы добавляете фрагменты при вызове onAttach() и удаляете в onDetach(). Интервьюер хочет услышать знаете ли вы стандартные методы API.

Системное API предоставляет два метода для поиска и получения фрагмента внутри активити: findFragmentByTag() и findFragmentById().

findFragmentByTag() принимает параметром тег, который передается в методе add() или replace() или в XML в элементе <fragment>. Возвращает null, если фрагмент не найден.

findFragmentById() принимает параметром id фрагмента. Если фрагмент добавляется методом add() или replace(), то id фрагмента – это id контейнера, который передается первым параметром. В случае добавления фрагмента через XML, id задается в элементе <fragment>. findFragmentById() возвращает null, если фрагмент не найден.


#android @android_dev_ru

Android Developer

02 Jul, 11:45


Поиск источника конфликта в Gradle зависимостях проекта, и решение проблемы.

@android_dev_ru #android #gradle

Читать статью

Android Developer

25 Jun, 06:54


📱 Android-приложение для демонстрации работы основных функций SDK на Kotlin

Отличная идея для пет-проекта;
описание возможностей приложения:
• Инициализация платежа
• Отмена платежа
• Возврат платежа
• Проведение клиринга
• Проведение рекуррентного платежа
• Получение информации/статуса платежа
• Добавление карт/Удаление карт
• Оплата добавленными картами
• Безакцептные платежи
• Создание платежа с Google Pay

🖥 GitHub

@android_dev_ru

Android Developer

22 Dec, 07:37


Подключение сканера к Android или как почувствовать себя кассиром

Недавно на одном из проектов мне потребовалась поддержка беспроводного сканера и получение с него данных.

Итак, наша основная задача – получить данные со сканера в нашем собственном приложении и как-то их использовать, в этом руководстве мы их просто выведем на экран. В качестве примера возьмём 2D сканер Mertech CL-2210.


Читать статью

Android Developer

07 Nov, 08:18


Что такое Activity State Loss Exception? Для чего нужен commitAllowingStateLoss()?

Это два вопроса на одну и ту же тему.
Под Activity State Loss Exception понимается исключение вида:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState with MyFragment.

Это исключение случается, когда метод FragmentTransaction.commit() вызывается после Activity.onSaveInstanceState(). Его не всегда удается поймать во время тестирования, потому что место вызова onSaveInstanceState() зависит от версии ОС.

В чем же причина исключения?
Когда пользователь уходит с активити, состояние сохраняется на случай, если активити будет уничтожена системой. Сохранение состояния происходит в методе onSaveInstanceState(). Если транзакция применяется после сохранения состояния, то транзакция не может быть сохранена и система бросает исключение.
Метод commitAllowingStateLoss() делает то же, что и метод commit(), но говорит системе, что мы готовы к потере состояния и исключение бросать не нужно. commitAllowingStateLoss() замалчивает, а не решает, проблему. Использование commitAllowingStateLoss() приводит к ситуациям такого вида:
Пользователь возвращается на активити, которая была уничтожена системой. Пользователь ожидает увидеть UI, который отображался перед тем как он покинул активити, но транзакция с добавлением или удалением фрагмента не сохранилась и пользователь видит пустой экран или активити в неверном состоянии.

Хорошей практикой считается использование commit(), а не commitAllowingStateLoss(). Если вы получаете репорты о state loss крэшах, пробуйте решить корень проблемы. Для этого не вызывайте commit() в onPause() или следующих после него методах.

Android Developer

28 Oct, 08:18


Электронные книги? Аудиокниги? Смешать, но не взбалтывать

Отпуск - замечательное время, которое не занято работой, а значит можно и нужно заняться тем, чем давно хотелось - хобби. Сегодня поговорим об одной из любимых тем - читалка и все, что с ней связано.

Читать статью

Android Developer

12 Sep, 05:59


Метод FragmentManager.commit() – синхронный или нет?

– Асинхронный.

Это значит, что транзакция не выполняется во время вызова метода. commit() добавляет транзакцию в очередь главного потока и транзакция выполняется при первой возможности.

Чтобы выполнить транзакцию синхронно, можно воспользоваться методом commitNow() вместо commit() или вызвать executePendingTransactions() после метода commit().

Android Developer

10 Aug, 17:12


Чем отличается tag в методах add() и addToBackStack()?

Tag в методе add() присваивается фрагменту. Fragment.getTag() возвращает этот тег.
Тег фрагмента используется в методе findFragmentByTag().

Tag в методе addToBackStack() это на самом деле не tag, а name. Имя транзакции, которое присваивается объекту BackStackEntry и возвращается методом getName().

Этот вопрос возник на собеседованиях, потому что когда только появились фрагменты было популярно писать такой код:

val tag = "home_fragment"
supportFragmentManager.beginTransaction()
.add(R.id.fragmentContainer, HomeFragment, tag)
.addToBackStack(tag)
.commit();



val lastEntryIndex = supportFragmentManager.backStackEntryCount - 1
val tag = supportFragmentManager.getBackStackEntryAt(lastEntryIndex).name
val topFragment = supportFragmentManager.findFragmentByTag(tag)

Сначала добавляется фрагмент с одинаковым тегом фрагмента и именем транзакции. Потом, используя имя-тег, можно получить инстанс фрагмента по позиции в бэкстэке.

Удобно? Нет! Не надо так делать.

Android Developer

11 Jun, 08:58


Своя библиотека под Android за один вечер

В процессе написания статьи она незаметно для меня трансформировалась из туториала по публикации Android-проекта как библиотеки в максимально душную статью о том, как математика пригодилась разработчику с гуманитарным бэкграундом в отрисовке анимашек. Статью подробную, разжеванную, с множеством строк кода. Возможно, не для слабонервных.

Читать статью

Android Developer

18 May, 09:01


Когда вызывается метод onUserLeaveHint?

Android Developer

11 May, 16:38


Важен ли порядок, в котором добавляются операции в FragmentTransaction?

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

1. Метод commit() должен вызываться последним.

2. Если несколько фрагментов добавляются в один контейнер, то порядок добавления определяет порядок в котором фрагменты отрисовываются в иерархии view.

Есть еще третий случай. Если метод addToBackStack(String name) вызывается несколько раз на одной транзакции, то транзакция добавляется в бэкстэк один раз с тегом, который передается в последнем вызове метода.

Пример:

supportFragmentManager.beginTransaction()
.add(R.id.fragmentContainer, Fragment1())
.addToBackStack("add1")
.add(R.id.fragmentContainer, Fragment2())
.addToBackStack("add2")
.commit()

Создается одна транзакция с тегом add2, которая добавляет сразу два фрагмента. При нажатии кнопки Back оба фрагмента будут удалены.

Поведение нескольких addToBackStack() не задокументировано и может различаться на разных версиях ОС, так что не забудьте на собеседовании сказать, что вы бы так никогда делать не стали.

Android Developer

10 May, 06:37


Расскажите про способы добавления и переключения фрагментов. Как работать с бэкстэком?

Для управления фрагментами используются два класса: FragmentManager и FragmentTransaction.

Для получения FragmentManager используются метод активити getSupportFragmentManager() или метод фрагмента getChildFragmentManager().
FragmentManager начинает транзакцию и возвращает объект FragmentTransaction вызовом метода beginTransaction().

Методы класса FragmentTransaction, которые необходимо знать - add(), remove() и replace().

add() добавляет фрагмент на активити или другой фрагмент. Принимает аргументами containerViewId, в который добавляется фрагмент, инстанс фрагмента, тег.
Другой способ добавить фрагмент - определить в лэйауте с помощью тега <fragment>.

remove() - операция, обратная add(). Удаляет фрагмент.

replace() удаляет все фрагменты, добавленные методом add() в заданный контейнер, и добавляет переданный аргументом фрагмент в контейнер. Параметр tag может быть null.

Эти операции не выполняются сразу же после вызова методов. Метод commit() завершает транзакцию и выполняет операции транзакции.

Метод addToBackStack() добавляет транзакцию в Back Stack. Это значит, что когда пользователь нажмет Back транзакция откатится. addToBackStack() применяется ко всем операциям в транзакции. Например следующий код добавляет транзакцию из трех операций в бэкстэк:

fragmentTransaction
.add(R.id.fragmentContainer1, fragment1)
.add(R.id.fragmentContainer2, fragment2)
.replace(R.id.fragmentContainer1, fragment3)
.addToBackStack("tag")
.commit()

Метод popBackStack() удаляет транзакцию с верхушки бэкстэка, возвращает true, если бэкстэк хранил хотя бы одну транзакцию.

Android Developer

08 May, 17:36


Fragment

Fragment используется для отображения части UI на экране. Фрагмент создается внутри активити или внутри другого фрагмента.

Для создания и управления фрагментами используется FragmentManager.

Класс-наследник класса Fragment должен иметь дефолтный конструктор без параметров. Система использует этот конструктор при пересоздании фрагмента.

Начиная с API v28 системный класс Fragment – deprecated. Рекомендуется использовать Fragment из Support Library.

Android Developer

07 May, 07:35


Нужно ли думать о сохранении состояния, если приложение поддерживает только портретную ориентацию?

– Да.

Поворот экрана – это частный случай Configuration Changes. Другой пример – изменение языка системы.

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

Android Developer

05 May, 12:33


Activity: Как пережить поворот экрана?

При повороте экрана активити уничтожается и создается заново. Вызываются коллбэки onPause(), onStop(), onSaveInstanceState(), onDestroy() – onCreate(), onStart(), onRestoreInstanceState(), onResume().

Чтобы сохранить состояние активити, вы должны переопределить метод onSaveInstanceState() и положить данные в Bundle.

При реинициализации активити, Bundle с сохраненным состоянием передается в onCreate() и в onRestoreInstanceState().

Система вызывает onSaveInstanceState() и onRestoreInstanceState() только в том случае, когда необходимо сохранить состояние, например при повороте экрана или при убийстве активити для освобождения памяти. Данные коллбэки не вызываются, если пользователь выходит из активити нажав Back или если активити убивается вызовом finish().

onSaveInstanceState() вызывается после onStop() на версии API ≥ 28. На API < 28 этот коллбэк вызывается перед onStop() и нет гарантий до или после onPause().

onRestoreInstanceState() вызывается после onStart().