如何在Delphi窗体中创建并嵌入原生Chromium WebView?
在Delphi Android项目中集成原生Chromium WebView的实现步骤
由于Delphi自带的TWebBrowser组件基于系统WebView,功能受限,直接调用Android原生Chromium WebView(系统内置的Chromium内核WebView)是可行的,核心是通过JNI桥接实现Delphi与Android原生API的交互,以下是具体实现步骤:
1. 依赖单元与权限配置
首先确保你的Delphi项目已引用以下Android相关单元:
uses Androidapi.JNI.Webkit, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.Helpers, FMX.Helpers.Android;
同时在AndroidManifest.template.xml中添加网络权限(加载网页必需):
<uses-permission android:name="android.permission.INTERNET" />
2. 动态创建并配置原生WebView
在Delphi窗体的OnCreate事件中,通过JNI创建原生WebView实例,并配置基础参数:
var LWebView: JWebView; LWebSettings: JWebSettings; LLayoutParams: JViewGroup_LayoutParams; LNativeView: JViewGroup; begin // 获取当前窗体对应的Android原生ViewGroup LNativeView := TJViewGroup.Wrap((Self as ICustomForm).GetNativeWindowHandle); // 创建WebView实例 LWebView := TJWebView.JavaClass.init(TAndroidHelper.Context); // 配置WebView基础设置 LWebSettings := LWebView.getSettings; LWebSettings.setJavaScriptEnabled(True); // 启用JS LWebSettings.setDomStorageEnabled(True); // 启用DOM存储 LWebSettings.setLoadWithOverviewMode(True); // 自适应屏幕 LWebSettings.setUseWideViewPort(True); // 设置WebViewClient(可拦截页面加载事件) LWebView.setWebViewClient(TJWebViewClient.JavaClass.init); // 设置布局参数:填充整个窗体 LLayoutParams := TJViewGroup_LayoutParams.JavaClass.init( TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT ); // 将WebView添加到窗体布局 LNativeView.addView(LWebView, LLayoutParams); // 加载目标URL LWebView.loadUrl(StringToJString('https://www.example.com')); // 保存WebView引用,方便后续操作或销毁 FWebView := LWebView; end;
注意:需要在窗体类中声明全局变量FWebView: JWebView;来持有WebView实例。
3. 生命周期与资源释放
在窗体的OnDestroy事件中销毁WebView,避免内存泄漏:
begin if Assigned(FWebView) then begin TJViewGroup.Wrap((Self as ICustomForm).GetNativeWindowHandle).removeView(FWebView); FWebView.destroy; FWebView := nil; end; end;
如果需要处理页面暂停/恢复(比如窗体切换时),可以在OnPause/OnResume事件中调用:
// 暂停WebView FWebView.onPause; // 恢复WebView FWebView.onResume;
4. 扩展功能(可选)
- 拦截URL加载:自定义WebViewClient并重写
shouldOverrideUrlLoading方法,实现URL跳转控制:
type TCustomWebViewClient = class(TJavaLocal, JWebViewClient) public function shouldOverrideUrlLoading(view: JWebView; url: JString): Boolean; cdecl; end; function TCustomWebViewClient.shouldOverrideUrlLoading(view: JWebView; url: JString): Boolean; var LUrl: string; begin LUrl := JStringToString(url); // 自定义URL处理逻辑,比如拦截特定域名 if Pos('example.com', LUrl) > 0 then begin view.loadUrl(url); Result := True; end else Result := inherited shouldOverrideUrlLoading(view, url); end;
然后替换之前的setWebViewClient代码为:
LWebView.setWebViewClient(TCustomWebViewClient.Create);
- 处理JavaScript交互:通过
addJavascriptInterface方法实现Delphi与JS的双向调用,需要注意Android API版本限制(Android 17+需要添加@JavascriptInterface注解)。
内容的提问来源于stack exchange,提问作者Yordan Yanakiev
相关产品推荐
相关产品推荐

