方案一:
安卓app禁止跟随系统字体大小,显示大小而改变。
1、定义工具类
public final class DisplayUtil {
/**
* 禁用7.0(23)以上显示大小改变和文字大小
*/
public static Resources disabledDisplayDpiChange(Resources res) {
Configuration newConfig = res.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//字体非默认值
if (res.getConfiguration().fontScale != 1) {
newConfig.fontScale = 1;
}
newConfig.densityDpi = getDefaultDisplayDensity();
res.updateConfiguration(newConfig, res.getDisplayMetrics());
} else {
//字体非默认值
if (res.getConfiguration().fontScale != 1) {
newConfig.fontScale = 1;//设置默认
res.updateConfiguration(newConfig, res.getDisplayMetrics());
}
}
return res;
}
/**
* 获取手机出厂时默认的densityDpi
*/
private static int getDefaultDisplayDensity() {
try {
Class aClass = Class.forName("android.view.WindowManagerGlobal");
Method method = aClass.getMethod("getWindowManagerService");
method.setAccessible(true);
Object iwm = method.invoke(aClass);
Method getInitialDisplayDensity = iwm.getClass().getMethod("getInitialDisplayDensity", int.class);
getInitialDisplayDensity.setAccessible(true);
Object densityDpi = getInitialDisplayDensity.invoke(iwm, Display.DEFAULT_DISPLAY);
return (int) densityDpi;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
}
- 在BaseActivity的onCreate()中调用工具类;
- 在单个Activity中使用时,Activity#setContentView()之前调用;
override fun onCreate(savedInstanceState: Bundle?) {
DisplayUtil.disabledDisplayDpiChange(getResource());
super.onCreate(savedInstanceState)
}
方案二:
使用 AutoSize 三方库;
使用方法参考说明文档。
方案三:
SmallestWidth适配方案,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。
AndroidStudio 使用ScreenMatch 插件,一键生成所有设备对应的 dimens.xml 文件。
下载插件 ScreenMatch 到本地,点击菜单栏上的 File -> Settings -> Plugins -> Install plugin from disk,然后选择我们刚刚下载的插件,最后点击 “OK”,重启 Andorid Studio 即可。
问题说明:
参考UI设计图,绘制页面时,未使用合适的倍率,导致dp值设置的不准确;
在适配华为手机 【显示大小】时,默认是从values的dimens.xml取值的,会导致页面显示问题;
解决方法:用 values-sw384dp 的资源替换了values 中dimens.xml。