android - 在 API 级别 30 (Android 11) : getDefaultDisplay() and getMetrics() are now deprecated. 上获取屏幕宽度我们应该改用什么?

标签 android deprecated deprecation-warning

我目前这样计算屏幕宽度:

public static int getScreenWidth(@NonNull Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics.widthPixels;
}
由于这两个函数( getDefaultDisplay() getMetrics() )现在已被弃用,我们应该改用什么?

最佳答案

为了计算屏幕宽度减去任何系统栏,这应该有效:

public static int getScreenWidth(@NonNull Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
        Insets insets = windowMetrics.getWindowInsets()
                .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars());
        return windowMetrics.getBounds().width() - insets.left - insets.right;
    } else {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.widthPixels;
    }
}
请注意,这并不完全相同:使用高度测试会产生不同的结果,并且我无法使用新 API 复制旧 API 的功能(部分原因是旧 API 的行为有点棘手原因并不总是你想要的,因此它被弃用了)。但是,在实践中,它应该足以作为许多事情的通用屏幕宽度。

关于android - 在 API 级别 30 (Android 11) : getDefaultDisplay() and getMetrics() are now deprecated. 上获取屏幕宽度我们应该改用什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63407883/

相关文章:

c++ - 如何将 wcstombs 转换为 wcstombs_s

python - Django 1.9 弃用警告 app_label

java - 尝试安装未签名的远程 .apk 文件时出现不一致的解析错误

android - 使用具有向后兼容性的 onBackPressed()

javascript - 在 react 导航中刷新 contentComponent

java - 如果您在 Java 中使用已弃用的方法/函数,会出现什么问题?

Android:从 kotlin 合成迁移到数据绑定(bind)后无法切换可见性

android - 在创建时设置全屏

python - 如何警告类(名称)弃用

androidx getFragmentManager() 已被弃用