我不知道如何获得用于 class 的屏幕密度

I don't know how to get the screen density for use in a class

我正在自学如何在 Kotlin 中编程,当我试图在 class 中创建一个函数来为我处理一些数学运算时,我 运行 遇到了一个问题。

我 运行 遇到的问题是我不知道如何在 class 中获取 var/val 的屏幕密度 class MainActivity.kt

我搜索了很多答案,但似乎无法想出合适的术语来获取我需要的资源,这让我抓狂。我发现的每一个答案要么不起作用,要么 Android Studio 说它会导致内存泄漏。

我知道如何使用此代码获得 MainActivity.kt 中的密度。

val scale: Float = resources.displayMetrics.density

感谢您的帮助。我真的很喜欢学习 Kotlin 以及如何制作应用程序。

您需要通过 Context 访问 resources,如 context.resources.displayMetrics.density。一个 Activity 一个 Context,这就是为什么你可以直接访问 resources(技术上是 this.resources,其中 this 是 Activity)

如果您直接在 Activity 中调用它,应该没有问题!如果它在另一个 class 中,你必须从某个地方得到一个 Context - 最好是传入一个(例如,如果 Activity 正在调用一个函数,它可以将自己作为 Context 参数).

有些东西是 Context,但在这种情况下,具体来说,you need to be careful:

After Build.VERSION_CODES#R, Resources must be obtained by Activity or Context created with Context.createWindowContext(int, Bundle). Application#getResources() may report wrong values in multi-window or on secondary displays.

基本上,上下文需要了解应用 window 有多大,Activity 会,但像 applicationContext 可能不会。


要小心的主要原因是 Activity 很大,所以当它们作为上下文传递时您不想保留它们,因为您可能会在 Activity 已被丢弃 - 这将是内存泄漏,这可能是您收到的警告!

通常,如果您 确实 需要保留 Context 以供将来使用,您会做类似 myContext = passedContext.applicationContext 的事情 - 所以您不会保留任何东西object 被传入时,您正在提取始终在内存中的共享应用程序上下文,因此保留它并不重要。这是一种安全的存储方式。

但是就像上面提到的文档一样,这在这里不好,所以理想情况下你的函数应该:

  • 使用Activity上下文计算函数内的任何内容,use/store那个值,丢弃上下文,
  • 在上下文中访问某些内容(resourcesdisplayMetrics 等)并存储 那个 如果您以后需要访问它

这样你就可以存储你需要的东西,而不是在你不需要的时候保留 Activity


刚开始时,上下文很奇怪,但它们基本上可以提供对有关代码 运行 所在环境和系统功能的信息的访问权限。有些更具体 - 例如 Activity 是您应用程序中的一个可见组件,因此它可以提供诸如其 window 尺寸之类的信息。

所以它们对于 Android 应用程序非常重要,你最终会传递它们很多次(你会在很多函数中看到它们作为参数),但你也必须小心通过将对它们的引用存储在比 Activity 本身寿命更长的组件中,将 Activity 保存在内存中。希望这是有道理的!