к основной активити, используя Glide. Иногда, а примерно, в 30% случаев активити не успевает подгружаться прежде, чем Glide пытается использовать контекст. Выдаёт ошибку: java.lang.NullPointerException: You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null
Как лучше всего сделать?
Грузить не во вью, а в файл
Который после будет использован во время инициализации основной активити?
Да. Иначе нельзя предсказать будет ли в нужный момент куда грузить картинку - время загрузки и старта активностей разное. Или грузить ее не в сплэше, а когда основная создана и имиджвью ненулевой
А если активити начнёт грузить файл, которого ещё нет? Т.е не успеет быть загружен
У вас Splash отдельным экраном идет?
А как иначе, но для него layout'а нет, а в теме задается изображение
если делаете через тему, так ставьте эту тему на главный экран
Если я поставлю тему на главный экран, то моё "лого" станет задним фоном этого главного экрана, а не как отдельный кадр, скрывающий за собой подгрузку view
Смотря где вы это поставите
не читали статью как правильно делать splash?
ога
Знаю, что способа 2. Первый это с отдельным layout, преимущества которого в возможном использовании анимации, но серьезный недостаток - время на подгрузку layout. Второй способ это тот, что на скрине, он быстрее, но недостаток в отсутствии возможности исп-ть анимацию
https://habr.com/ru/post/345380/
прочтете статью и все свои проблемы 2мя строчками решите
По сути один из нужных способов мне использую. У меня главная цель скрыть подгрузку view для пользователя таким образом, чтобы и фрагмент подгрузки был получен своевременно (что исключило бы exception), и пользователь не видел никакой подгрузки. Но, судя по всему идеального способа нет, учитывая нек-ые популярные приложения. Подгружать в файл, а из файла в активити, это те же проблемы со синхронностью процесса
так а зачем Вы отдельный экран используете?
Под отдельным экраном подразумеваете отдельный Activity? Я через тему задаю сплэш, а отдельное активити мне нужно, чтобы там описать действия подгрузки до того, как пользователь увидит основной экран. Layout не использую
Если задача сплеша - просто показать лого в момент загрузки - тогда просто backgroundDrawable для активити. Он покажется в процессе загрузки активити (векторные картинки нормально работают только с 6 андроида). Если задача спеша выполнить какие-то действия (после резюма приложения проверить стейт и определить, на какой экран идти, например, показать экран ввода пин кода, если прошло какое-то время, или перейтина экран авторизации) - тогда оптимальным будет отображать фрагмент (или DialogFragment)
Ваш пример не сработает. Первую секунду после запуска - экран будет черный/белый. Тоже статью не читали
можно подробнее про векторные картинки и minAPI 23?
backgroundDrawable не сработает?
в первую секунду - нет
Видели как YouTube открывается?
векторные картинки на api 21 будут растягиваться на весь экран. Им нельзя задать размер через тему
Очень важный факт, спасибо
Сорян, я имел ввиду windowBackground
Просто у тебя будет 2 разных drawable. Обычный условно <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="@color/colorWindowBackground" /> </shape> </item> <item android:bottom="120dp"> <bitmap android:gravity="center" android:src="@drawable/ic_splash_logo" /> </item> </layer-list> Где ic_splash_logo - это png. А в drawable-v23 файлик с таким же названием и уже может быть вектором
drawable-v23 - файлы этой директории используются от API23, правильно понимаю?
да
Вы тоже используете для Splash отдельный экран? (Activity)
Теперь понятно, зачем нужна та директория. А drawable-v24 - это для какой проблемы?
это для api = 24
Я понимаю, а в API-24 какая особенность отображения в отличии от API <23 и API >23
а какая у них может быть особенность?
Активити не использую конечно. Раньше всегда использовал android:windowBackground. Но на последнем проекте мы используем DialogFragment т.к. windowBackground не удовлетворяет требованиям. А именно: после каждого резюма приложения нужно определить, на какой экран перевести пользователя в зависимости от некоторых условий (сделать это во время показа сплеша). Проблема с колд стартом решается максимальным облегчением UI треда. При желании можно сделать аналогичный windowBackground. Но придется слегка упороться из-за статус и навигейшн бара.
То же самое, только возмется для версий 24+
человек думает что эти папки для всяких воркэраундов, но должен знать что там может быть любавя версия апи, а для чего это нужно - уже отдбелнбый вопрос, на который и может не быть ответва
значит человек перепрыгнул главу про ресурсы. Не надо так было делать
Думаю проще объяснить, что чаще всего, туда помещают реализации для легаси
Ой а можете поподробнее рассказать по этому поводу либо мб есть статья или ещё чего?
https://habr.com/ru/post/345380/
это ж для эксперемента? ужас какой)
Там с диалогфрагментом есть?
Это всё понятно. Речь шла о том, для каких целей обособлено v21,v23,v26. Иначе можно было бы для каждой API по папке создать
нет, там про избежание дополнительной Activity
ну как ужас, это все правильно, хорошо. Но если был такой проект живой - жесть
У меня сейчас и так без сплэш Активити)
Тему с ресурсами не пропускал)
В смысле ужас? Это для поддержки разных типов устройств. Телефонов, планшетов 7", 10", разных языков и др
В результате получилось приложение, которое рендерится на любых устройствах, RTL все дела
А собрать в мастер-папки желания не было?
Что за мастер папки? Я когда-то пробовал папки через прописание сорс сетов, но как-то не срослось
Вот оно да
Обсуждают сегодня