我需要屏幕的宽度。但最近发现Android defaultDisplay
已弃用,并显示以下消息:
默认的提示显示:显示!”不推荐使用。在Java中已弃用
代码:
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
return displayMetrics.heightPixels
请提出一个替代方案。
答案 0 :(得分:4)
答案 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)
如果您需要的是获取窗口的大小,新的 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