在我的应用中,我的初始屏幕和内容的背景有很大不同-初始屏幕是深色的,统一的颜色,需要默认的灯光状态栏图标(深色背景上的白色图标),而我的内容则混合了白色墙纸一直位于状态栏后面,因此需要深色的状态栏图标。
这可以通过使用两种单独的样式来解决,一种将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
属性。