Android屏幕适配方案

文章介绍了三种安卓应用防止字体随系统大小改变的方案:1)使用DisplayUtil工具类强制设置字体比例;2)引入AndroidAutoSize库进行屏幕适配;3)利用SmallestWidth进行资源文件的适配。针对华为手机显示问题,通过使用values-sw384dp资源替换默认dimens.xml以解决页面显示异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方案一:

安卓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)
}

方案二:

使用 AndroidAutoSize 三方库;

A low-cost Android screen adaptation solution (今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案).

方案三:

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值