Изменение состояния подсветки строки состояния во время работы - PullRequest
1 голос
/ 10 марта 2019

В моем приложении мой экран-заставка и контент имеют значительно разные фоны - экран-заставка имеет более темный, однородный цвет, для которого требуются стандартные значки в строке состояния (белые иконки на более темном фоне), тогда как мой контент смешивает белые обоиполностью за строкой состояния, поэтому требуются темные значки строки состояния.

Это можно решить с помощью двух отдельных стилей, один с 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 не поддерживается после запуска приложения.

...