我打算将本地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());
}
使用这两种解决方案我都会收到错误:
我还应该尝试什么?
答案 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)
以下是相关帖子和官方样本
看看这是否有帮助。
和
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;
}