默认的Getter显示:显示!不推荐使用。 Java中不推荐使用

时间:2020-08-06 02:50:27

标签: android android-layout kotlin

我需要屏幕的宽度。但最近发现Android defaultDisplay已弃用,并显示以下消息:

默认的提示显示:显示!”不推荐使用。在Java中已弃用

代码:

val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
return displayMetrics.heightPixels

请提出一个替代方案。

7 个答案:

答案 0 :(得分:4)

此方法在API级别30中已弃用。

改为使用Context.getDisplay()

描述方法:getDefaultDisplay

新方法:getDisplay

答案 1 :(得分:3)

defaultDisplay在API级别30(Android R)及更高版本中被标记为已弃用。 这意味着,如果您的最低SDK配置低于API级别30,则应同时使用旧的不赞成使用的代码和新的推荐使用的代码。

正确解决问题后,您可以使用@Suppress(“ DEPRECATION”)取消警告

示例:Kotlin解决方案

    val outMetrics = DisplayMetrics()

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
        val display = activity.display
        display?.getRealMetrics(outMetrics)
    } else {
        @Suppress("DEPRECATION")
        val display = activity.windowManager.defaultDisplay
        @Suppress("DEPRECATION")
        display.getMetrics(outMetrics)
    }

答案 2 :(得分:1)

WindowManager.getDefaultDisplay() 在 API 级别 30 中被弃用,取而代之的是需要最低 API 级别 30 的 Context.getDisplay() 方法。

目前,androidx.core.content.ContextCompat 似乎没有提供任何向后兼容的 getDisplay() 方法。

如果您只需要检索默认显示,而不是像其他答案建议的那样针对不同的 API 级别使用不同的方法,您可以使用 DisplayManager.getDisplay(Display.DEFAULT_DISPLAY) 方法(自 API 17 起支持)来实现相同的结果。

弃用的代码:

val windowManager = getSystemService<WindowManager>()!!
val defaultDisplay = windowManager.defaultDisplay

新代码:

val displayManager = getSystemService<DisplayManager>()!!
val defaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY)

参考:androidx.core source code


如果您需要的是获取窗口的大小,新的 Jetpack WindowManager library 为新旧平台版本的新窗口管理器功能(例如可折叠设备)提供了一个通用 API 界面。

  • WindowManager.getCurrentWindowMetrics():根据当前系统状态返回WindowMetrics。这些指标描述了窗口将占据的区域大小,MATCH_PARENT 宽度和高度以及允许窗口延伸到显示切口后面的任何标志组合。
  • WindowManager.getMaximumWindowMetrics():返回应用在当前系统状态下可能期望的最大 WindowMetrics。这个值基于系统的最大潜在窗口状态。例如,对于多窗口模式下的 Activity,返回的指标基于用户展开窗口以覆盖整个屏幕时的边界。

示例代码 (ref):

dependencies {
    implementation "androidx.window:window:1.0.0-alpha07"
}

import androidx.window.WindowManager

val vm = WindowManager(context)
vm.currentWindowMetrics.bounds // E.g. [0 0 1350 1800]
vm.maximumWindowMetrics.bounds 

答案 3 :(得分:0)

我在应用程序的Kotlin中使用此代码来获取显示器的尺寸。

private fun getScreenSize()
{
    val metrics = DisplayMetrics()
    windowManager.defaultDisplay.getMetrics(metrics)
    width = metrics.widthPixels
    height = metrics.heightPixels
}

它适用于使用Android 11及更高版本的设备,当然也适用于较旧的设备。

我希望它会有所帮助。干杯!

答案 4 :(得分:0)

任何想用 java 来做的人都在这里:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {

        Display display = this.getDisplay();
        DisplayMetrics displayMetrics = new DisplayMetrics();
        display.getRealMetrics(displayMetrics);

        float density  = getResources().getDisplayMetrics().density;
        float dpHeight = displayMetrics.heightPixels / density;
        float dpWidth  = displayMetrics.widthPixels / density;

        Log.d(TAG, "OmesChecka R: "+"second width:"+dpWidth+"second h:"+dpHeight);

    }else {

        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics ();
        display.getMetrics(outMetrics);

        float density  = getResources().getDisplayMetrics().density;
        float dpHeight = outMetrics.heightPixels / density;
        float dpWidth  = outMetrics.widthPixels / density;

        Log.d(TAG, "OmesChecka: "+"second width:"+dpWidth+"second h:"+dpHeight);
    }

答案 5 :(得分:0)

由于我不得不去几个地方才能得到完整的答案,这里是一个帖子: getDefaultDisplay 方法自 Android API 30 (Android 11) 起已弃用,但仍然有效。

即便如此,由于它已折旧,因此您应该对 Android 11 使用新方法,并且仍然为 Android 10 或更早版本实现旧方法。

这是带有注释的代码:(要运行它,您需要在 build.gradle 中启用 viewBinding(因为我没有使用 findViewByID),一个带有名为“main_activity”的顶级布局的 activity_main.xml,一个按钮视图名为“calculate_button”,以及三个名为“android_version”、“screen_height”和“screen_width”的文本视图。)

package com.example.test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.DisplayMetrics
import android.view.WindowManager
import com.example.test.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.calculateButton.setOnClickListener { calcScreenSize() }
    }

    private fun calcScreenSize() {   //All in one function to calculate and display screen size in pixels 
        val metrics = DisplayMetrics()
        var width: Int = 0
        var height: Int = 0
        val version = android.os.Build.VERSION.SDK_INT   //Check android version. Returns API # ie 29 (Android 10), 30 (Android 11)
        if (version >= android.os.Build.VERSION_CODES.R) {    //If API is version 30 (Android 11) or greater, use the new method for getting width/height
            binding.androidVersion.setText("Android API Version: $version")
            binding.mainActivity.display?.getRealMetrics(metrics) //New method
            width = metrics.widthPixels
            height = metrics.heightPixels
            binding.screenHeight.setText("Height: $height")  //Display Width and Height in Text Views
            binding.screenWidth.setText("Width: $width")

        } else {
            binding.androidVersion.setText("Android API Version: $version")  //If API is less than version 30 (ie 29 (Android 10)), use the old method for getting width/height
            @Suppress("DEPRECATION")    //Suppress the "Deprecation" warning
            windowManager.defaultDisplay.getMetrics(metrics) //Old method
            width = metrics.widthPixels
            height = metrics.heightPixels
            binding.screenHeight.setText("Height: $height") //Display Width and Height in Text Views
            binding.screenWidth.setText("Width: $width")

        }

    }
}

答案 6 :(得分:0)

与其这样做,不如这样做,省去编写更多代码的麻烦。

val dialog = super.onCreateDialog(savedInstanceState)
dialog.setOnShowListener {
    val bottomSheetDialog = it as BottomSheetDialog
    val parentLayout =
        bottomSheetDialog.findViewById<View>(R.id.design_bottom_sheet)
    parentLayout?.let { bottomSheet ->
        val behaviour = BottomSheetBehavior.from(bottomSheet)
        val layoutParams = bottomSheet.layoutParams
        layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT
        bottomSheet.layoutParams = layoutParams
        behaviour.state = BottomSheetBehavior.STATE_EXPANDED
    }
}
return dialog
相关问题