You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:05:28