![](/img/trans.png)
[英]How I can get screen density when I don't have activity-object to get windowManager?
[英]I don't know how to get the screen density for use in a class
我正在自學如何在 Kotlin 中編程,當我嘗試在 class 中為我處理一些數學問題時,我遇到了一個問題。
我遇到的問題是我不知道如何在 MainActivity.kt 之外的 class 中將屏幕密度作為 var/val
我已經搜索了很多答案,但我似乎無法想出正確的術語來獲得我需要的資源,這讓我發瘋了。 我發現的每個答案要么不起作用,要么 Android Studio 說它會導致 memory 泄漏。
我知道如何使用此代碼獲取 MainActivity.kt 中的密度。
val scale: Float = resources.displayMetrics.density
謝謝你的幫助。 我真的很喜歡學習 Kotlin 以及如何制作應用程序。
您需要通過Context
訪問resources
,如context.resources.displayMetrics.density
。 Activity
是Context
,這就是為什么您可以直接訪問resources
的原因(技術上它是this.resources
, this
是 Activity)
如果您直接在 Activity 中調用它,那應該不是問題,如果它在另一個類中,則必須從某個地方獲取Context
- 理想情況下傳遞一個(例如,如果 Activity 正在調用 function,它可以將自身作為Context
參數傳遞)。
有一些東西是Context
,但在這種情況下, 你需要特別小心:
在
Build.VERSION_CODES#R
之后,必須通過使用Context.createWindowContext(int, Bundle)
創建的Activity
或Context
來獲取資源。Application#getResources()
可能會在多窗口或輔助顯示器上報告錯誤的值。
基本上 Context 需要知道應用程序 window 有多大, Activity
會,但applicationContext
之類的可能不會。
要小心的主要原因是活動很大,所以當它們作為上下文傳遞時你不想保留它們,因為你可能會在活動被丟棄后將它們保留在 memory - 那將是memory 泄漏,這可能是您收到的警告!
通常,如果您確實需要保留 Context 以供將來使用,您會執行類似myContext = passedContext.applicationContext
類的操作 - 因此您不會保留傳入的任何 object ,而是提取共享的應用程序上下文反正一直在memory,所以留着也沒關系。 這是一種安全的存儲方式。
但就像上面提到的文檔一樣,這在這里不好,所以理想情況下你的 function 會:
resources
、 displayMetrics
等)並在以后需要訪問時將其存儲這樣你就可以存儲你需要的東西,而不是在你不需要的時候堅持住 Activity
剛開始時,上下文很奇怪,但它們基本上是提供對有關代碼運行環境和系統功能的信息的訪問。 還有一些更具體——比如Activity
是應用程序中的可見組件,因此它可以提供 window 的尺寸等信息。
因此,它們對於 Android 應用程序非常重要,並且您最終會大量傳遞它們(您會在很多函數中將它們視為參數),但您還必須小心通過存儲引用將Activity
保留在 memory 中在比 Activity 本身壽命更長的組件中給他們。 希望這有點道理!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.