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

时间:2015-03-15 17:37:06

标签: xamarin xamarin.android xamarin.forms

我打算将本地HTML文件加载到Xamarin Forms WebView中。

我已将HTML文件添加到assets/HTML文件夹,其Build Action设置为AndroidAsset。

我已经实现了基本网址查找器界面:

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());
        }

使用这两种解决方案我都会收到错误:

enter image description here

我还应该尝试什么?

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这是我的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中。

答案 2 :(得分:0)

我不确定你为什么遇到麻烦。 我按照你的步骤做了一些工作:

该代码段如下所示:

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();
}

Android合约:

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

答案 3 :(得分:0)

以下是相关帖子和官方样本

看看这是否有帮助。

Xamarin load local 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;
    }