「已注销」 2019-09-03 13:59 采纳率: 100%
浏览 505
已采纳

APP在MIUI上运行,切换字体大小后没有调用onConfigurationChanged。

问题描述

需求是要保证APP的文字大小不受系统文字大小设置的影响。

我在搜索了相关问题之后,采用了重写getResource方法和onConfigurationChanged方法,同时在manifest文件中给activity进行配置的办法来解决这个问题。正常打开APP没有任何问题,字号确实不会随着系统设置而变化。

Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改

但是这样做,在华为平板(揽阅M2青春版,Android 5.1.1,EMUI 3.1)上没有问题,在小米手机(米6,Android 8.0,MIUI 10.3稳定版)上,**切换了字号之后回到APP,APP会自尽(不是闪退,下面会说)**。

代码展示

AndroidManifest.xml

<!-- 主界面 -->
        <activity
            android:name=".ui.MainActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|fontScale|locale|layoutDirection|keyboard"
            android:exported="false"
            android:launchMode="standard"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

BaseActivity.java

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        LogHelper.customLogging("showControl",this.getClass().getName()+"执行了  onConfigurationChanged");
        if (newConfig.fontScale != 1)//非默认值
            getResources();
        super.onConfigurationChanged(newConfig);
    }

    /**
     * 重写 getResource 方法,防止系统字体影响
     */
    @Override
    public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
        Resources resources = super.getResources();
        if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
            android.content.res.Configuration configuration = resources.getConfiguration();
            configuration.fontScale = 1.0f;
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        }
        return resources;
    }

日志信息

这是我的米6的日志

图片说明

红线处执行的操作是:

1、APP进入后台;2、更改系统文字大小;3、APP回到前台;

可以看到mainActivity在完成了自己应该做的操作(销毁、创建、展示)后多做了一次销毁操作。而且onConfigurationChanged方法中的日志也没有被打印。

所以米6走的路径是相当于ManiFest文件中没有配置fontScale。

这是华为平板的日志

图片说明

红线处操作同上

这里就执行了onConfigurationChanged方法,只需要重新显示一下activity就可以了。

自己的分析

多了一个onDestroy,导致了APP还活着(AndroidStudio的Logcat一栏显示的包名后面没有DEAD字样),但是Activity已经没了,所以显示的是桌面,看起来是闪退一样,但其实只是他自尽了……

#**各位大神,救救孩子,这个问题怎么解决啊?!**

  • 写回答

1条回答 默认 最新

  • 「已注销」 2019-09-03 15:23
    关注

    走投无路之下采用穷举法来解决问题,不光要加fontScale,还要加上uiMode(EMUI的就不用),深度定制版的系统太麻烦了,想买个pixel,emmmm又太贵了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?