【问题标题】:Disabling an app or activity zoom if Setting -> Display -> Display size changed to Large or small如果设置 -> 显示 -> 显示大小更改为大或小,则禁用应用程序或活动缩放
【发布时间】:2018-10-19 12:22:50
【问题描述】:

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

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

【问题讨论】:

    标签: android android-manifest android-settings


    【解决方案1】:

    我假设您正在尝试获得不会改变的显示,如果用户更改了手机上关于 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的这个特性非常方便,如果你的应用不能用它编译,它可能会指出你应该更好地构建你的布局。

    【讨论】:

    • @SportyAndroidDev 这个答案对你有帮助吗?
    【解决方案2】:

    我已经找到了解决办法。

    如果系统文本大小更改或显示大小设置为大(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);
    

    【讨论】:

    • 相当老套的解决方案,但它确实对我有用。确保将其放在onCreate 之前 setContentView 中,否则屏幕旋转后将无法使用
    【解决方案3】:

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

    【讨论】:

    • 这段代码无法编译!你能分享一下这个编译的相同概念吗?谢谢。
    • 没关系它只需要一个 null !检查 resources.displayMetrics.xdpi 的末尾。
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多