Delphi开发Android多窗体应用:返回主窗体后无法保持全屏的解决方法
Delphi Android多窗体返回后主窗体恢复全屏的解决方法
你的问题核心是关闭第二个窗体后,Android系统自动显示了状态栏和导航栏,而FMX自带的全屏属性设置没能及时覆盖系统行为。以下是几个可行的解决办法:
方法一:调用Android原生API强制设置沉浸全屏模式
直接操作Android系统的窗口和视图属性,比FMX封装的属性更可靠,尤其是在窗体切换场景下。在主窗体的FormActivate事件中添加以下代码:
uses Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, FMX.Forms; procedure TForm1.FormActivate(Sender: TObject); var Window: JWindow; DecorView: JView; begin // 仅针对Android平台执行 if TOSVersion.Platform = pfAndroid then begin Window := TAndroidHelper.Activity.getWindow; DecorView := Window.getDecorView; // 设置窗口标志,隐藏状态栏和导航栏 Window.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN); Window.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_LAYOUT_NO_LIMITS); Window.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_LAYOUT_IN_SCREEN); // 启用粘性沉浸模式:用户滑动调出系统UI后会自动隐藏 DecorView.setSystemUiVisibility( TJView.JavaClass.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or TJView.JavaClass.SYSTEM_UI_FLAG_FULLSCREEN or TJView.JavaClass.SYSTEM_UI_FLAG_HIDE_NAVIGATION or TJView.JavaClass.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or TJView.JavaClass.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ); end; // 同步FMX窗体属性 Self.FullScreen := True; Self.WindowState := wsMaximized; Self.BorderStyle := bsNone; LoadMainMenu(); end;
这段代码直接告诉Android系统,当前窗口需要完全沉浸,隐藏所有系统UI,并且设置为粘性模式,避免用户误触调出UI后无法自动恢复。
方法二:修改窗体切换逻辑(备选)
如果不想调用原生API,可以尝试不关闭第二个窗体,而是隐藏它,这样主窗体的全屏状态不会被系统重置:
- 打开Form2时使用
Form2.Show; - 返回主窗体时使用
Form2.Hide;而非Form2.Close; - 若需要释放Form2资源,可在主窗体退出时再调用
Form2.Free;
这种方式适合窗体复用的场景,但如果必须关闭Form2,还是推荐方法一。
方法三:调整FMX属性设置时机
你之前在FormActivate设置属性无效,可能是因为FMX属性生效时机晚于系统UI显示。可以尝试把属性设置移到主窗体的FormCreate事件中,同时确保FormActivate中的代码在LoadMainMenu之前执行:
procedure TForm1.FormCreate(Sender: TObject); begin Self.FullScreen := True; Self.WindowState := wsMaximized; Self.BorderStyle := bsNone; end;
不过这种方法稳定性不如方法一,因为Android系统在窗体切换时仍可能重置UI状态。
内容的提问来源于stack exchange,提问作者Shiffles
相关产品推荐
相关产品推荐

