В моем приложении мой экран-заставка и контент имеют значительно разные фоны - экран-заставка имеет более темный, однородный цвет, для которого требуются стандартные значки в строке состояния (белые иконки на более темном фоне), тогда как мой контент смешивает белые обоиполностью за строкой состояния, поэтому требуются темные значки строки состояния.
Это можно решить с помощью двух отдельных стилей, один с android:windowLightStatusBar
установленным в значение true, а другой - в значение false.
Однако, независимо от того, что я делаю, я не могу заставить это свойство изменить фактический рисунок строки состояния.Если я запускаю приложение с темными значками строки состояния, я получаю темные значки полностью, если я выбираю светлые значки строки состояния, я получаю их.
Мое приложение использует одну архитектуру действий, и я использую пользовательскиеМетод расширения наложения макета, который выглядит следующим образом:
fun <B : ViewDataBinding> BaseFragment<*, B>.bind(
inflater: LayoutInflater,
@LayoutRes layout: Int,
container: ViewGroup?,
@StyleRes style: Int? = null,
afterBind: () -> Unit = {}
): B =
DataBindingUtil.inflate<B>(activity!!.getInflater(style), layout, container, false).also {
if(style != null) activity?.setTheme(style).also { Timber.d("Theme set to ${activity?.resources?.getResourceEntryName(style)}") }
this.binding = it
binding.setVariable(BR.viewModel, viewModel)
binding.lifecycleOwner = this
afterBind()
}
fun Context.getInflater(@StyleRes style: Int? = null): LayoutInflater =
if(style == null)
LayoutInflater.from(this)
else
LayoutInflater.from(this).changeTheme(style)
fun LayoutInflater.changeTheme(@StyleRes style: Int): LayoutInflater = cloneInContext(ContextThemeWrapper(context, style))
Этот метод bind
используется в классе BaseFragment
, так что я могу определять свои фрагменты с определенными макетами и вставлять соответствующий ViewModel какну вот так:
abstract class BaseFragment<VM : BaseViewModel, B : ViewDataBinding>(vmClass: KClass<VM>, @LayoutRes protected val layout: Int) :
Fragment(), KoinComponent {
internal open lateinit var binding: B
internal open val viewModel: VM by viewModelByClass(vmClass)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) =
bind(inflater, layout, container).root
}
class SplashFragment :
BaseFragment<SplashViewModel, FragmentSplashBinding>(
SplashViewModel::class,
R.layout.fragment_splash
) { }
Я не уверен, что моя архитектура портит изменение строки состояния, или изменение свойства android:windowLightStatusBar
не поддерживается после запуска приложения.