Erc*_*car 3 android android-studio
我将我的应用程序升级到 SDK 30。我看到 FLAG_FULLSCREEN 已弃用。然后,我用这个更改了代码;
final WindowInsetsController insetsController = getWindow().getInsetsController();
if (insetsController != null) {
insetsController.hide(WindowInsets.Type.statusBars());
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在 API 26 上运行我的应用程序时出现此错误。
java.lang.NoSuchMethodError: No virtual method getInsetsController()Landroid/view/WindowInsetsController; in class Landroid/view/Window; or its super classes (declaration of 'android.view.Window' appears in /system/framework/framework.jar:classes2.dex)
Run Code Online (Sandbox Code Playgroud)
Google 目前正在开发 WindowInsetsContrloller 的 Compat 版本。这样,您就不需要通过 android API 级别(如@PerracoLabs 的回答中所示)进行 if/else 分支。在 WindowInsetsContrloller 的 Compat 版本上,我们不需要使用 getWindow().setFlags() 因为 window.insetsController?.hide() 将适用于所有 android 版本。
更新:
他们已经做到了 - 类 androidx.core.view.WindowInsetsControllerCompat。您需要使用 androidx.core 1.5.0-alpha02 或更高版本。
我的代码示例:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
WindowCompat.setDecorFitsSystemWindows(window, false)
hideSystemBars()
}
private fun hideSystemBars() {
val insetsControllerCompat = WindowInsetsControllerCompat(window, window.decorView)
insetsControllerCompat.systemBarsBehavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
insetsControllerCompat.hide(systemBars())
}
private fun showSystemBars() {
val insetsControllerCompat = WindowInsetsControllerCompat(window, window.decorView)
insetsControllerCompat.show(systemBars())
}
Run Code Online (Sandbox Code Playgroud)
当发现弃用警告时,您必须执行 API 级别的 {if /else} 条件分支来处理这两种情况,因此,新代码适用于较新的 API 级别/旧代码适用于较旧的 API 级别。
如果您的目标 API 级别高于弃用级别,则弃用警告仍然会出现,并且可以选择抑制它,并且也可以保留警告以便轻松发现它以便将来可能删除。在下一个示例中,它被抑制。
请注意,在某些情况下,Google 可能会为您提供Compat库,这些库在内部执行必要的 API 分支,当针对开发人员特定问题的Compat库可用时,这始终是最理想的解决方案。
对于您的具体情况,您可以执行以下操作:
爪哇
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
final WindowInsetsController controller = getWindow().getInsetsController();
if (controller != null)
controller.hide(WindowInsets.Type.statusBars());
}
else {
//noinspection deprecation
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
Run Code Online (Sandbox Code Playgroud)
科特林
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.insetsController?.hide(WindowInsets.Type.statusBars())
}
else {
@Suppress("DEPRECATION")
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2419 次 |
| 最近记录: |