在运行时更改状态栏的灯光状态

时间:2019-03-10 09:44:58

标签: android kotlin android-theme android-statusbar

在我的应用中,我的初始屏幕和内容的背景有很大不同-初始屏幕是深色的,统一的颜色,需要默认的灯光状态栏图标(深色背景上的白色图标),而我的内容则混合了白色墙纸一直位于状态栏后面,因此需要深色的状态栏图标。

这可以通过使用两种单独的样式来解决,一种将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属性。

0 个答案:

没有答案