我正在开发一个用 Java 编写的 Android 应用程序(家庭项目)。我是一名业余 Android 开发人员,为了实现全屏功能,我应用了几年前成功使用的相同步骤:
<style name="Base.Theme.MyApp" parent="Theme.Material3.Light.NoActionBar"> <item name = "android:windowActionBar">false</item> <item name = "android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowLightStatusBar">false</item> </style> <style name="Theme.MyApp" parent="Base.Theme.MyApp" />
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); //apparently for API 35+ this is the only thing I need View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); setContentView(R.layout.activity_main); ... }
问题是,在 API 34 上测试时,我的应用程序是有点全屏。顶部应该是系统栏的地方有一条细黑线。此外,Play 商店还警告我,我正在使用已弃用的全屏视图方法。 为了解决这个问题,我浏览了 Google 文档,意识到 API 版本 29 - 35 有不同的方法(我支持的最小 SDK 是 25),但显然我无法正确理解实现,因为每当我尝试 Google 文档中的解决方案时 - 黑色行要么保留,要么应用程序变为全屏,系统栏绘制在我的应用程序的顶部。我尝试按照 Google 文档的建议使用插图和边距,但没有给出任何结果。 我非常绝望,甚至向 GTP 寻求解决方案,显然,我得到了推测性的、不起作用的“解决方案”和“想法”。
你能帮我解决这个问题吗?如何实现适用于 API 版本 29-35 的正确全屏支持?
令人难以置信的是,像在全屏模式下显示应用程序而屏幕上没有其他元素这样琐碎的日常事情是如此复杂,并且比设置活动的单纯属性需要更多的代码哈哈
编辑: 这是我尝试的最新尝试:
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EdgeToEdge.enable(this); Window window = getWindow(); View decorView = getWindow().getDecorView(); WindowCompat.setDecorFitsSystemWindows(window, false); WindowInsetsControllerCompat controllerCompat = new WindowInsetsControllerCompat(window, decorView); controllerCompat.hide(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.navigationBars()); controllerCompat.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
我还从主题.xml 中删除了任何内容,主题父级只是 Theme.Material3.Light.NoActionBar
好的,解决了!对于任何有同样问题的人 - 我想通了。所以:
我使用了没有前置和后置摄像头的模拟器,但当我将皮肤切换到 Pixel 5 时,我意识到黑线高度与前置摄像头高度完全对应。我继续深入挖掘,发现在“onCreate”方法中使用此代码:
decorView.setOnApplyWindowInsetsListener((v, insets) -> { return insets.consumeSystemWindowInsets(); // Consume all insets to avoid unexpected padding }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; getWindow().setAttributes(layoutParams); }
强制 Android 一直扩展 Activity,即使这意味着 UI 的某些部分可能会被前置摄像头遮挡。现在可以了! :)
附注 我不知道为什么当我说“全屏”而没有指定其他选项时,Android 很难理解,我想要全屏,即使它会以硬件部分阻碍 UI 的形式产生后果......:)