用户设置老人显示模式:显示(分辨率)大小和默认字体, 你的app布局就会出现错乱,超出等问题, 为了适配这个问题可以通过强行忽略显示大小和默认字体大小实现
很简单, 原理是获取手机默认的字体大小和dpi , 然后在BaseActivity中重写getResources, 恢复它, 代码如下:
override fun getResources(): Resources {
val res = super.getResources()
if (res != null && res.configuration.fontScale != 1.0f) {
res.configuration.fontScale = 1.0f //恢复默认的[字体大小]
res.configuration.densityDpi = defaultDisplayDensity //恢复默认的[显示大小]
res.updateConfiguration(res.configuration, res.displayMetrics)
}
return res
}
private val defaultDisplayDensity by lazy {
try {
val clazz = Class.forName("android.view.WindowManagerGlobal")
val method = clazz.getMethod("getWindowManagerService")
method.isAccessible = true
val iwm = method.invoke(clazz)
val getInitialDisplayDensity =
iwm.javaClass.getMethod("getInitialDisplayDensity", Int::class.java)
getInitialDisplayDensity.isAccessible = true
val densityDpi = getInitialDisplayDensity.invoke(iwm, Display.DEFAULT_DISPLAY);
densityDpi as Int
} catch (e: Exception) {
e.printStackTrace()
-1
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.fontScale != 1.0f) {
//刷新
resources
}
super.onConfigurationChanged(newConfig)
}
测试平台: 华为, Android 9
版权声明:本文为u014418171原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。