如果将 -> 显示 -> 显示大小更改为大或小,则禁用应用或活动缩放



在我的应用程序中,我不想允许它在创建设计问题时调整大小。

我尝试过在应用程序标记和启动器活动标记中使用android:resizeableActivity="false",但没有帮助。

我找到了一个解决方案。

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

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);

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

您可以使用DisplayMetrics来实现这一点。

DisplayMetrics metrics = getResources().getDisplayMetrics();

对于"正常"比例因子值,metrics.xdpimetrics.densityDpi具有相同的值。如果不是这样的话,您可以得到"真实"比例因子,也就是当用户使用以下方法进行正常缩放时使用的比例因子。

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

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


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

首先,因为这是一项艰巨的工作,而且在未来的更新中很难维护这些代码。

其次,Android的这一功能非常方便,如果你的应用程序没有使用它进行编译,它可能会指出你应该更好地构建布局。

这里的答案只是部分正确,因为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)

最新更新