如何在Xamarin Forms WebView中加载本地HTML文件

1tuwyuhd  于 2022-12-07  发布在  其他
关注(0)|答案(4)|浏览(351)

我打算将本地HTML文件加载到Xamarin Forms WebView中。
我已经将HTML文件添加到assets/HTML文件夹中,并且将其Build Action设置为AndroidAsset。
我已经实现了基本URL查找器接口:

public class BaseUrl_Android:IBaseUrl
    {
        public string Get()
        {
            return "file:///android_asset/";
        }
    }

我尝试在共享的可移植代码中使用以下代码从加载文件:

string baseUrl = DependencyService.Get<IBaseUrl>().Get();
   string url = baseUrl + "HTML/local.html";
   myWebView.Source = url;

我还尝试了自定义WebViewRenderer,并使用了以下代码:

protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);
        if (e.OldElement == null)
        {
            // lets get a reference to the native control
            var webView = (global::Android.Webkit.WebView)Control;
            // do whatever you want to the WebView here!                                
            webView.LoadUrl(DependencyService.Get<IBaseUrl>().Get()+"HTML/local.html");
            webView.SetWebViewClient(new MyWebViewClient());
        }

对于这两种解决方案,我都得到一个错误:

我还能尝试什么?

0ve6wy6x

0ve6wy6x1#

您的来源类型应该是HtmlWebViewSource,而不是字串。

var html = new HtmlWebViewSource ();
html.BaseUrl = DependencyService.Get<IBaseUrl> ().Get ();
new9mtju

new9mtju2#

这是我的MainActivity.cs;

WebView web_view;

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);

    web_view = FindViewById<WebView>(Resource.Id.webview);
    web_view.Settings.JavaScriptEnabled = true;

    web_view.LoadUrl("file:///android_asset/Home.html");

}

您必须将html文件放入Assets文件夹并设置html构建操作AndroidAsset。这样我就可以将html文件加载到WebView中。

zzlelutf

zzlelutf3#

我不知道你为什么会有麻烦。我按照你的步骤做,事情就这样成功了:
代码段如下所示:

public ViewModel()
{
    var rootUrl = DependencyService.Get<INativeURL>().Acquire();
    Url = $"{rootUrl}content.html";
}

注意事项:

“Content.html”是我添加到本地Droid项目的“Assets”文件夹中的本地网页的名称。

XAML格式

<ContentPage.BindingContext>
    <local:ViewModel/>
</ContentPage.BindingContext>

<WebView Source="{Binding Url}" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />

视图模型:

public ViewModel()
    {
        var rootUrl = DependencyService.Get<INativeURL>().Acquire();
        Url = $"{rootUrl}content.html";
    }

    string _url = null;
    public string Url
    {
        get
        {
            return _url;
        }
        set
        {
            if (_url != value)
            {
                _url = value;
                OnNotifyPropertyChanged();
            }
        }
    }

接口:

public interface INativeURL
{
    string Acquire();
}

安卓合约:

[assembly: Dependency(typeof(NativeURL_Android))]
namespace my_namespace.Droid
{
    public class NativeURL_Android : INativeURL
    {
        public string Acquire() => "file:///android_asset/";
    }
}
ffvjumwh

ffvjumwh4#

这里是相关的帖子和官方样本
看看这个能不能帮上忙。
Xamarin加载本地html

Official sample here

public LocalHtmlBaseUrl ()
    {
        var browser = new BaseUrlWebView (); // temporarily use this so we can custom-render in iOS

        var htmlSource = new HtmlWebViewSource ();

        htmlSource.Html = @"<html>...</html>";

        htmlSource.BaseUrl = DependencyService.Get<IBaseUrl> ().Get ();

        browser.Source = htmlSource;

        Content = browser;
    }

相关问题