如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或 activity 缩放

Disabling an app or activity zoom if Setting -> Display -> Display size changed to Large or small

在我的应用程序中,我不想让它因为创建设计问题而调整大小。

我已经尝试在应用程序标签和启动器 activity 标签中使用 android:resizeableActivity="false",但没有用。

我假设您正在尝试获得显示,如果用户更改 phone 上关于 UI 大小的辅助功能选项,该显示不会改变。

您可以使用 DisplayMetrics 使它正常工作。

DisplayMetrics metrics = getResources().getDisplayMetrics();

与 "normal" 比例因子值 metrics.xdpimetrics.densityDpi 具有相同的值。如果不是这种情况,您可以获得 "real" 比例因子,这是用户使用以下标准比例缩放时使用的比例因子。

if(metrics.xdpi != metrics.densityDpi){
        Log.d(TAG,"Real scale " +  (metrics.xdpi / metrics.densityDpi)*metrics.density);
}

然后你可以使用所述值乘以布局中的固定值,以便它可以在不同的屏幕上具有精确的密度。这也意味着布局中的 每个 值必须使用 px 而不是 dpsp


虽然这种方法可行,但我强烈建议不要使用它。

首先,因为这是一项大量的工作,并且在以后的更新中很难维护该代码。

其次,Android的这个特性非常方便,如果你的应用程序没有用它编译,它可能会指出你应该更好地构造你的布局。

我已经找到解决办法了。

如果系统文本大小更改或显示大小设置为大(高于 Android Oreo),您的应用程序将正常运行(没有大文本和缩放视图),代码如下:

        Configuration configuration = getResources().getConfiguration();
        configuration.fontScale = (float) 1; //0.85 small size, 1 normal size, 1,15 big etc
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        metrics.scaledDensity = configuration.fontScale * metrics.density;
        configuration.densityDpi = (int) getResources().getDisplayMetrics().xdpi;
        getBaseContext().getResources().updateConfiguration(configuration, metrics);

这里的答案只是部分正确,因为 xdpi 和 densityDPI 只在模拟器中重合,所有手机的 xdpi 都不一样,而 densitydpi 是一样的,所以这样做会更明智:

val configuration = getResources().getConfiguration()
    val metrics = getResources().getDisplayMetrics()
    Log.d("TAG", metrics.toString() + " " + getResources().getConfiguration())
    when (resources.displayMetrics.xdpi) { //change size to ignore display size
        in 1..120 -> {
            configuration.densityDpi = 120
        }
        in 121..160 -> {
            configuration.densityDpi = 160
        }
        in 161..240 -> {
            configuration.densityDpi = 240
        }
        in 241..320 -> {
            configuration.densityDpi = 320
        }
        in 321..480 -> {
            configuration.densityDpi = 480
        }
        in 481..640 -> {
            configuration.densityDpi = 640
        }
    }
    getBaseContext().getResources().updateConfiguration(configuration, metrics)