Как стать автором
Обновить

Комментарии 24

Для любителей MVP ничего не остается, как использовать стандартный способ, который описан в официальной документации.

А как же Moxy и стратегии?
Это не заставляет уходить с простого полюбившегося подхода и не париться о диалогах :)


PS: спасибо, хорошая статья!

Зачем все это? Можно просто указать в манифесте флаг на отмену пересоздания активити при повороте экрана
Можно просто указать в манифесте флаг на отмену пересоздания активити при повороте экрана

Не всегда «просто». Иногда требуется при повороте экрана изменить верстку в соответствии с ориентацией.
Есть тысяча и одна причина, почему активити может быть пересоздана. Этот «костыль» лишь отложит проблему, а не исправит её.
Для этого надо постоянно запоминать на каком экране пользователь и какие поля заполнены/что отображается на экране. И потом восстанавливать
Это все за вас уже делает сам андроид, нужно только правильно использовать. Если у вас есть свои собственные элементы, то при правильной имплементации(onSaveInstanceState/onRestoreInstanceState), они так же будут сохранять свое состояние автоматически.
А если видос вылетел, что, на тот же момент вернет? Сомневаюсь. Или фотку после вылета с нужным зумом покажет? Но круто, если так.
Ну вам же написали про onSaveInstanceState/onRestoreInstanceState. Стандартные компоненты по возможности восстанавливают свое состояние. Для всего остального уже есть готовые инструменты, на которые большинство разработчиков забивают, потому что на возросших мощностях девайсов нужно еще постараться, чтобы воспроизвести пересоздание активити системой.
Но на одних позитивных сценариях далеко не уедешь, максимум это все эти запреты переворотов сойдут только для низкобюджетных или pet-проектов.
Смеюсь. Покажите мне вменяемое андроид-приложение в лс. Я от силы штук 5 вылизанных могу показать, остальных просто нет. Копни чуть глубже обычных кейсов и там ужас. Алерты в стиле 2.3, локализация, внимание к мелочам, правильная логика работы с памятью, интеграция в систему — со всем этим есть проблемыы у проектов из ТОП-10
Это не повод делать так же =)
Вот поэтому я и говорю про подход «пусть костыль, но лучше того, что предлагает стандарт». Поэтому лучше сохранить все что сейчас на экране самому, запретить пересоздание когда это можно, а когда нельзя — пусть пересоздается, потом восстановим

Для фрагментов в бэкстеке ваш способ не пройдет, у них дестроится вью при реплейсе. И придется восстанавливать стейт.

Дико сложно. У меня может быть много разных диалогов в одной активити (не одновременно, конечно, по очереди). Они через JNI cвязаны с С++ ядром. Для себя решил, что единственный способ нормально писать приложение без кучи левого кода и головной боли — отключить пересоздания активити при повороте. Да, согласен, что кому-то может быть нужен разный layout для портертной и пльбомной ориентации, тогда это не сработает, но у меня всё корректно лэйаутится автоматом из одного и того же XML.
Выше же писали что переворот это частный случай пересоздания активити и все случаи не отключить. Попробуйти включить «донт кип активити» и посмотрите что будет =)
Я понимаю, но мне это не кажется существенно важным. И даже утекающие диалоги вряд ли критичны, я считаю, что по сравнению с кучей спагетти-кода это меньшее зло. А вот то, что пользователь хотел что-то рассмотреть получше, повернул телефон, а UI исчез с экрана — вот так делать некрасиво.
Хм. Не понятно почему UI должен вдруг изчезнуть с экрана. При перевороте система «отрисует» либо тотже лейаут что и для портрета, либо лейаут специально предназначеный для ландскейпа.

И в большистве случаев при пересоздании активити (если дев не поддерживает это) происходит краш =) Но это по моему личному опыту =)
Активити, конечно, никуда не исчезнет; я говорил о диалогах, созданных через AlertDialog.Builder.
А еще, можно запрещать поворот экрана при показе диалога, а при закрытии разрешать его :)
Уже миллион раз сказано — пересоздание активити происходит не только при перевороте, а еще при смене локали, сим-карты, подключении внешней клавы, смене размера шрифта, смене размера экрана (multiwindow), смена ui-режима (dex-станция).
Будете все запрещать?
Да даже при входящем звонке система может прибить активити, а после окончания звонка пользователь вернется в приложение без восстановленного стейта.
Ну по идеи на почти все можно же запретить)
Тогда лучший вариант тестирования приложения на предмет пересоздания активити — это «don't keep activity» в параметрах разработчика?
Papashkin не совсем, это исскуственная смерть Activity, которая может помочь найти пару багов, но в реальности не может быть. Подробнее тут habr.com/ru/company/redmadrobot/blog/426617
Не знаю что там в вашей реальности, но в моей этот режим часто помогает повторить краши что репортируют пользователи =)
Вот извечная печаль андроид-разработки — когда визуально простое поведение требует ну совсем нетривиальных решений… И расскажи это потом заказчику, отчего у тебя куча времени ушла на какую-то ерунду…
Зарегистрируйтесь на Хабре , чтобы оставить комментарий