簡體   English   中英

我不知道如何獲得用於 class 的屏幕密度

[英]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 ActivityContext ,這就是為什么您可以直接訪問resources的原因(技術上它是this.resourcesthis是 Activity)

如果您直接在 Activity 中調用它,那應該不是問題,如果它在另一個類中,則必須從某個地方獲取Context - 理想情況下傳遞一個(例如,如果 Activity 正在調用 function,它可以將自身作為Context參數傳遞)。

有一些東西是Context ,但在這種情況下, 你需要特別小心

Build.VERSION_CODES#R之后,必須通過使用Context.createWindowContext(int, Bundle)創建的ActivityContext來獲取資源。 Application#getResources()可能會在多窗口或輔助顯示器上報告錯誤的值。

基本上 Context 需要知道應用程序 window 有多大, Activity會,但applicationContext之類的可能不會。


要小心的主要原因是活動很大,所以當它們作為上下文傳遞時你不想保留它們,因為你可能會在活動被丟棄后將它們保留在 memory - 那將是memory 泄漏,這可能是您收到的警告!

通常,如果您確實需要保留 Context 以供將來使用,您會執行類似myContext = passedContext.applicationContext類的操作 - 因此您不會保留傳入的任何 object ,而是提取共享的應用程序上下文反正一直在memory,所以留着也沒關系。 這是一種安全的存儲方式。

但就像上面提到的文檔一樣,這在這里不好,所以理想情況下你的 function 會:

  • 使用活動上下文計算 function 中的任何內容,並使用/存儲該值,丟棄上下文,
  • 訪問上下文中的某些內容( resourcesdisplayMetrics等)並在以后需要訪問時將其存儲

這樣你就可以存儲你需要的東西,而不是在你不需要的時候堅持住 Activity


剛開始時,上下文很奇怪,但它們基本上是提供對有關代碼運行環境和系統功能的信息的訪問。 還有一些更具體——比如Activity是應用程序中的可見組件,因此它可以提供 window 的尺寸等信息。

因此,它們對於 Android 應用程序非常重要,並且您最終會大量傳遞它們(您會在很多函數中將它們視為參數),但您還必須小心通過存儲引用將Activity保留在 memory 中在比 Activity 本身壽命更長的組件中給他們。 希望這有點道理!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM