Можно ли инфлейтить layout с Application Context
Что проверяют
Понимаете ли вы, что Context при инфлейте несёт тему и конфигурацию, а не только доступ к ресурсам. Следом обычно спрашивают, какой контекст брать для диалога и для вью из сервиса.
Как отвечать
Технически можно: LayoutInflater.from(applicationContext).inflate(...) отработает. Но результат будет другим, и причины стоит назвать конкретно:
- тема: атрибут
android:themeу<application>задаёт тему по умолчанию для активностей, а инфлейт через контекст приложения идёт с системной темой устройства. Атрибуты вида?attr/colorPrimaryразрешатся не так, а компоненты Material упадут сIllegalArgumentException: им нужна темаTheme.MaterialComponentsилиTheme.Material3; - AppCompat-подмена:
AppCompatActivityвешает на свой инфлейтер фабрику, которая превращаетTextViewвAppCompatTextView,ButtonвAppCompatButton. С контекстом приложения фабрики нет, получатся обычные системные вью без тинтинга; - конфигурация: ресурсы активности учитывают её собственные переопределения, например ночной режим через
AppCompatDelegateили размер окна в многооконном режиме. Контекст приложения их может не видеть; - код, ожидающий Activity: приведение
context as Activityвнутри кастомной вью упадёт сClassCastException.
Правильный выбор: для UI контекст активности или view.context. Если вью нужна вне активности, например оверлей через WindowManager из сервиса, оберните контекст: ContextThemeWrapper(applicationContext, R.style.AppTheme), так тема применится явно.
Покажите и обратную сторону: контекст приложения берут там, где объект живёт дольше экрана (синглтоны, репозитории, WorkManager), чтобы не удерживать активность.
Где спотыкаются
Инфлейтят через контекст приложения «чтобы не было утечек». Утечку создаёт долгоживущая ссылка на вью или активность, а не выбор инфлейтера.
Путают вопрос контекста с вопросом корня: inflate(R.layout.item, null) теряет layout_* параметры корневого элемента при любом контексте. В адаптере правильно inflate(R.layout.item, parent, false).
Создают диалог с контекстом приложения. У него нет токена окна, и показ заканчивается WindowManager$BadTokenException.