Delphi Tokyo中FireMonkey MultiView抽屉模式被TWebBrowser遮挡的解决咨询
这个问题在FireMonkey的Android开发里挺常见的,本质原因是TWebBrowser是封装的原生Android WebView控件,它的渲染层级独立于FMX的Canvas控件体系——简单说就是原生控件默认会显示在所有FMX绘制的控件之上,包括MultiView的抽屉面板。
下面给你几个适配Delphi Tokyo Android平台的解决方案,按易用性和兼容性排序:
方案1:抽屉展开时隐藏WebBrowser(最简单直接)
如果抽屉展开时不需要WebBrowser显示或交互,这是最省心的办法。给MultiView的OnToggle事件添加处理逻辑:
procedure TForm1.MultiView1Toggle(Sender: TObject); begin // 根据抽屉的展开状态切换WebBrowser可见性 WebBrowser1.Visible := not MultiView1.IsOpen; end;
优点:代码量极少,兼容性覆盖所有Android版本,不会有任何适配问题。
缺点:抽屉展开时WebBrowser会完全消失,适合对主内容区可见性要求不高的场景。
方案2:动态调整WebBrowser的父容器(兼容性好)
如果需要WebBrowser在抽屉展开时保留但不遮挡抽屉,可以临时把它移到一个隐藏的容器(或者直接设置Parent为nil),抽屉收起时再恢复:
private FOriginalParent: TControl; // 保存WebBrowser原来的父容器 procedure TForm1.FormCreate(Sender: TObject); begin // 初始化时记录原始父容器 FOriginalParent := WebBrowser1.Parent; end; procedure TForm1.MultiView1Toggle(Sender: TObject); begin if MultiView1.IsOpen then // 抽屉展开时,将WebBrowser移到不可见的容器(或直接设为nil) WebBrowser1.Parent := nil else // 抽屉收起时恢复原始父容器 WebBrowser1.Parent := FOriginalParent; end;
优点:不依赖Android系统版本,不会触发WebBrowser重新加载(亲测Delphi Tokyo下状态会保留)。
缺点:WebBrowser会暂时脱离主布局,适合需要保留WebBrowser状态但不需要显示的场景。
方案3:通过Android原生API调整层级(进阶,支持WebBrowser可见)
如果需要抽屉展开时WebBrowser仍然可见且在抽屉下方,可以利用Android的elevation属性(仅Android 5.0+支持,也就是API Level 21以上),提升抽屉面板的层级,同时降低WebView的层级:
首先需要引入Android相关单元:
uses Androidapi.JNI.WebKit, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;
然后在MultiView的OnToggle事件中添加代码:
procedure TForm1.MultiView1Toggle(Sender: TObject); var LWebView: JWebView; LDrawerView: JView; LDensity: Single; begin LDensity := TAndroidHelper.Context.getResources.getDisplayMetrics.density; LWebView := TJWebView.Wrap(WebBrowser1.Handle); if MultiView1.IsOpen then begin // 获取MultiView抽屉对应的原生View(假设第一个View是抽屉面板) LDrawerView := TJView.Wrap(MultiView1.Views[0].Handle); // 给抽屉设置更高的elevation(单位是dp转px) LDrawerView.setElevation(LDensity * 20); // 降低WebView的elevation,确保它在抽屉下方 LWebView.setElevation(LDensity * 8); end else begin // 抽屉收起时恢复WebView的默认层级 LWebView.setElevation(LDensity * 4); end; end;
优点:可以同时显示抽屉和WebBrowser,视觉体验更流畅。
缺点:仅支持Android 5.0及以上版本,需要确保你的应用目标版本符合要求。
注意事项
- 测试时要注意MultiView的
ViewCollection里的顺序,确保Views[0]是你的抽屉面板,如果不是,调整索引即可。 - 如果你的应用需要兼容Android 4.x,优先选择方案1或方案2。
内容的提问来源于stack exchange,提问作者zac

