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

问题描述 投票:4回答:4

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

我已将HTML文件添加到assets/HTML文件夹,并且其“构建操作”设置为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());
        }

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8zOGJSUi5wbmcifQ==” alt =“在此处输入图像说明”>

我还应该尝试什么?

xamarin xamarin.android xamarin.forms
4个回答
0
投票

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

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

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中。


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/";
    }
}

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;
    }
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.