2015-03-15 4 views
3

Я намереваюсь загружать локальные файлы HTML в Xamarin Forms WebView.Как загрузить локальные 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()); 
     } 

С обоими решениями я получаю сообщение об ошибке:

enter image description here

Что еще я должен попробовать?

ответ

1

Ваш источник должен быть типа HtmlWebViewSource, а не строки.

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

Это мой 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 action action AndroidAsset. Таким образом, я могу загрузить html-файл в WebView.

+0

Ваше решение основано на работе шаблон, задаваемый вопрос относится к подкатегории "Blank App (Xamarin.Forms Portable)" –

1

Я не уверен, почему у вас были проблемы. Я следовал ваши шаги и вещи просто работали:

Сниппет выглядит следующим образом:

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

Примечание:

«content.html» это имя моей локальной веб-страницы, я добавил в папку «Активы» моего локального проекта Droid.

XAML

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

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

ViewModel:

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

Что такое DependencyService? это класс? если да, то где мне нужно создавать и какой контент я должен писать в нем? –

1

Здесь связана должность и официальный образец

Смотрите, если это может помочь.

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; 
    } 
+0

Добавить образец ссылки! – MaxJ

Смежные вопросы