Pull to refresh

Обновление Android Jetpack: Activity Result API и рефакторинг Fragment

Development for Android *

Привет! С вами Android Broadcast. Прошли 2 недели и очередной релиз библиотек Jetpack от Google уже с нами. Вышло долгожданное исправление множества багов в Fragment из-за рефакторинга внутри FragmentManager, Activity Result API и много другого. Все самое интересное вы найдете в статье, а все подробности можете найти на сайте

Читать далее
Total votes 4: ↑4 and ↓0 +4
Views 3.5K
Comments 0

Транзакции фрагментов и потеря состояния активности

Development for Android *
Для тех, кто не сталкивался с этой проблемой, поясню на примере — в конце длительной фоновой операции вы показываете диалог (да Google не рекомендует так делать, но заказчик требует). Если до показа диалога вы свернете приложение нажав клавишу Home, то во время показа диалога произойдет исключение IllegalStateException. То же самое произойдет в случае показа диалога ожидания и скрытия его по завершению фоновой активности — вызов метода dismiss() после сохранения состояния вызовет исключение.



Лучшая статья на эту тему, которую я нашел погуглив проблему это Fragment Transactions & Activity State Loss. Статья объясняет проблему, но дает только общие советы, сама проблема остается нерешенной. Возможно кому-то из хабражителей будет интересно сделать перевод статьи, а пока расскажу вкратце ее смысл. Система Android обладает возможностью завершить любую активность вашего приложения и ее фрагменты при нехватке памяти. Чтобы скрыть от пользователя этот прискорбный факт, Android сохраняет состояние активности и восстанавливает его при необходимости, так что пользователь даже не замечает какие катаклизмы происходили на уровне кода. Когда вы пытаетесь отобразить диалог после сохранения состояния, по сути вы нарушаете сохраненное состояние и такая активность не может быть восстановлена. Android решает это простейшим для себя способом — выкидывает исключение и не позволяет закомитить транзакцию фрагментов. А ваше приложение просто крашится.

Читать дальше →
Total votes 17: ↑14 and ↓3 +11
Views 12K
Comments 15

Возврат результата выполнения из DialogFragment во Fragment минуя Activity

Development for Android *
Sandbox

Введение


В этой публикации я покажу, как можно передавать события из DialogFrament в вызывающий Fragment минуя Activity.

В официальном Guide по Dialogs есть раздел PassingEvents. В нем рассказано, как вернуть результат работы DialogFragment в вызывающую Activity. Для этого создается дополнительный интерфейс. Activity реализует этот интерфейс, а у DialogFrament есть ссылка на Activity.

Если инициатором вызова DialogFragment является другой Fragment, то в таком подходе нам придется сначала отправить результат в Activity, а потом уже из Activity в заинтересованный в данных Fragment. Отсюда и минусы:
  • Activity знает о деталях реализации фрагмента (сегодня это дополнительный диалог, а завтра можем реализовать все на одном фрагменте);
  • дополнительный код (больше кода = больше возможностей для ошибок).

Читать дальше →
Total votes 8: ↑7 and ↓1 +6
Views 30K
Comments 15

Сохранение состояния фрагментов (Fragment)

Development for Android *
Sandbox
Tutorial
Распространенной проблемой является некорректное поведение приложения при повороте девайса. Дело в том что при повороте Activity-host (Activity которое является родителем для фрагмента) уничтожается. В тот момент когда этот процесс происходит FragmentManager отвечает за уничтожение дочернего фрагмента. FragmentManager запускает методы угасающего жизненного цикла фрагмента: onPause(), onStop() и onDestroy().

В случае если в контроллере нашего дочернего фрагмента, к примеру, есть объект Media-Player, то в методе фрагмента Fragment.onDestroy() экземпляр нашего звонко играющего Media-Player-а прервет воспроизведение медиа данных. Первое, что приходит в голову, сохранить состояние объекта Media-Player вызвав Fragment.onSaveInstanceState(Bundle), что сохранит данные, а новое Activity загрузит их. Однако, сохранение состояния объекта MediaPlayer и его последующее восстановление, все равно, прерывает воспроизведение и заставляет акул ненависти сновать в головах пользователей.
Читать дальше →
Total votes 10: ↑10 and ↓0 +10
Views 50K
Comments 16

История URL, часть 2: путь, фрагмент, запрос и авторизация

Website development *
Translation

mosaic web browser


URL'ы не должны были стать тем, чем стали: мудрёным способом идентифицировать сайт в интернете для пользователя. К сожалению, мы не смогли стандартизировать URN, который мог бы стать более полезной системой наименования. Считать, что современная система URL достаточно хороша — это как боготворить командную строку DOS и говорить, что все люди просто должны научиться пользоваться командной строкой. Оконные интерфейсы были придуманы, чтобы пользоваться компьютерами стало проще, и чтобы сделать их популярнее. Такие же мысли должны привести нас к более хорошему методу определения сайтов в Вебе.

— Дейл Догэрти, 1996

Есть несколько вариантов определения слова "интернет". Один из них — это система компьютеров, соединенных через компьютерную сеть. Такая версия интернета появилась в 1969 году с созданием ARPANET. Почта, файлы и чат работали в этой сети еще до создания HTTP, HTML и веб-браузера.


В 1992 году Тим Бернерс-Ли создал три штуки, благодаря которым родилось то, что мы считаем интернетом: протокол HTTP, HTML и URL. Его целью было воплотить понятие гипертекста в реальности. Гипертекст, в двух словах — это возможность создавать документы, которые ссылаются друг на друга. В те годы идея гипертекста считалась панацеей из научной фантастики, заодно с гипермедиа, и любыми другими словами с приставкой «гипер».

Читать дальше →
Total votes 27: ↑27 and ↓0 +27
Views 22K
Comments 7

История в каждой вкладке или multiple backstack

Development for Android *


Проблема


С выходом android 3.0 (Api Level 11) в android появились фрагменты, и так уж у разработчиков google получилось, что для них поддерживается только один backstack. Не всегда дизайнеры и заказчики хотят учитывать эту особенность. А иногда просто хотят полную копию уже существующего ios приложения.

Допустим нам нужно сделать подобие Tab Bar на android, в том числе с сохранением истории в каждой вкладке. Но у нас один backstack, и что же нам делать? Задача кажется невозможной.
Как сделать то, что невозможно?
Total votes 13: ↑8 and ↓5 +3
Views 5.5K
Comments 20

Разбираемся с Conductor

Development for Android *
Sandbox

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


Conductor позиционируется как замена стандартным фрагментам. Основная идея обернуть View и дать доступ к методам жизненного цикла. Conductor имеет свой жизненный цикл, который сильно проще чем у фрагметов, но и в нём есть свои хитрости (об этом дальше).


Основные преимущества, которые даёт Conductor:


  • Упрощение кода
  • Транзакции выполняются мгновенно
  • Возможность построить приложение на одной Activity
  • Не ограничивает в выборе архитектуры приложения
  • Легко встраиваемые анимации
  • Отсутствие необходимости сохранять состояния между изменениями конфигураций

Так же в коробке вы получите:


  • Работа с бэкстеком
  • Стандартные коллбеки активити легко доступны
  • Несколько стандартных анимаций
  • Привязка жизненного цикла к RxJava
  • Быстрая интеграция с ViewPager

Далее мы с вами разберём несколько типовых кейсов использования, которые встречаются почти во всех приложения и попробуем разобраться в жизненном цикле контроллера.


Читать дальше →
Total votes 17: ↑16 and ↓1 +15
Views 14K
Comments 1

Лицензия на вождение болида, или почему приложения должны быть Single-Activity

red_mad_robot corporate blog Development for Android *

image


На AppsConf 2018, которая прошла 8-9 октября, я выступил с докладом про создание андроид-приложений целиком в одном Activity. Хотя тема известная, существует много предубеждений относительно такого выбора — переполненный зал и количество вопросов после выступления тому подтверждение. Чтобы не ждать видеозаписи, я решил сделать статью с расшифровкой выступления.



О чем я расскажу


  1. Почему и зачем надо переходить на Single-Activity
  2. Универсальный подход для решения задач, которые вы привыкли решать на нескольких Activity
  3. Примеры стандартных бизнес задач
  4. Узкие места, где обычно подпирают код, а не делают все честно
Читать дальше →
Total votes 43: ↑40 and ↓3 +37
Views 49K
Comments 84

Как в Android'е передать переменную из фрагмента в активность?

Java *Development for Android *Kotlin *
Sandbox
Рассказ о том, как в Android'е передать информацию из фрагмента (Fragment) в активность (Activity). Информация будет полезной для новичков (джуниоров), осваивающих программирование для Android, и вряд ли будет интересной для миддлов и сеньоров.

Запускаем IDE (integrated development environment) Android Studio. Создаём новый проект: File -> New -> New Project. Выбираем «Empty Activity», жмём «Next».
Читать дальше →
Total votes 29: ↑17 and ↓12 +5
Views 12K
Comments 26

Навигация для Android с использованием Navigation Architecture Component: пошаговое руководство

Development of mobile applications *Development for Android *Kotlin *Mobile applications design *
Tutorial
Попробуем, пользуясь официальным руководством и примерами кода, построить работающую систему навигации для будущего многоэкранного приложения в соответствии со стандартами Navigation Architecture Component. Статья включает следующие разделы:

Часть 1. Подготовительные работы
— 1.1. Создание проекта
— 1.2. Зависимости (Dependencies)
— 1.3. Страницы: создание фрагментов
— 1.4. Адреса: файл ресурсов типа «Navigation»
— 1.5. Фрейм: виджет NavHostFragment

Часть 2. Элементы навигации
— 2.1. Навигация с помощью кнопок
— 2.2. Боковое меню (Drawer)
— 2.3. Панель инструментов: Toolbar вместо ActionBar
— 2.4. Нижнее меню (Bottom Navigation)
— 2.5. Всплывающее меню (Overflow Menu)

Краткие выводы и ссылка на github
Читать дальше →
Total votes 8: ↑8 and ↓0 +8
Views 27K
Comments 5

Hidden mistakes with Shared Element Transitions

red_mad_robot corporate blog Development of mobile applications *Development for Android *


There is a good practice to make your application beautiful and live, and nowadays there are a lot of tools and ways to achieve this. One of them is Shared Element Transition.

In this article I’ll cover a few mistakes which have cost me a lot of time; I’ll show how to avoid them if you decide to implement this kind of transitions with Fragments on application.
Read more →
Total votes 13: ↑13 and ↓0 +13
Views 7.8K
Comments 4

Отправка событий из ViewModel в Activity/Fragment в MVVM

Home Credit Bank corporate blog Development of mobile applications *
Tutorial
Сегодня речь пойдет о том, как обмениваться события между Activities/Fragments и ViewModel в MVVM. Для получения данных из ViewModel, рекомендуется в Activity/Fragment подписываться на данные LiveData, находящиеся во ViewModel. Но что делать для отправки единичных (и не только) событий, таких как показать уведомление или, например, открыть другой фрагмент?


Читать дальше →
Total votes 1: ↑1 and ↓0 +1
Views 6K
Comments 10

Получаем результат правильно (Часть 2). Fragment Result API

e-legion corporate blog Development of mobile applications *Development for Android *
Tutorial

Мы продолжаем рассказ о новинках библиотеки Jetpack, призванных упростить обмен данными между компонентами Android приложения. Первая часть была посвящена передаче данных из Activity и новому Api Activity Result.  

На этот раз посмотрим, какое решение Google предлагает для Fragment. Ввиду популярности паттерна “Single Activity” работа с фрагментами представляет большой практический интерес для многих Android-разработчиков.

“Как передать данные между двумя фрагментами?” - частый вопрос на собеседованиях. Ответить на него можно по-разному: создание общей ViewModel, имплементация интерфейса в Activity, использование targetFragment и другие способы. 

С появлением Fragment Result Api в этот список добавился простой способ передачи небольшого объема информации из одного фрагмента в другой. Например, возвращение результата какого-либо пользовательского сценария. Мы разберем, как применять новый Api на практике, но сначала немного теории.

Читать далее
Total votes 3: ↑3 and ↓0 +3
Views 6.5K
Comments 2

Jetpack Fragment 1.4: Multi Back Stack, StrictMode

Surf corporate blog Development for Android *

Из статьи вы узнаете про новинки Jetpack Fragment 1.4: поддержку множественного back stack, FragmentStrictMode, новый менеджер состояний Fragment. Также расскажем, какие улучшения произошли под капотом.

Читать
Total votes 6: ↑6 and ↓0 +6
Views 2.1K
Comments 4