2012-03-13 1 views
0

В моем нынешнем проекте монодроида есть две проблемы: одна при загрузке из Активы, а другая - созданная веб-страница, передаваемая для отображения, и их взаимосвязь, которая делает вещи более раздражающими!Проблемы с WebView и активами

Проблема с активами достаточно проста, файл не найден. Мой текущий код выглядит следующим образом

Android.App.Application.SynchronizationContext.Post(delegate 
{ 
    string uri = "file:///android_asset/StyleSheet.css"; 
    string settings = string.Empty; 

    using (var input = c.Assets.Open(uri)) 
    using (StreamReader sr = new System.IO.StreamReader(input)) 
    { 
     settings = sr.ReadToEnd(); 
    } 

    string CSS = "<html><head><style>" + settings + "</style></head><body style='height:600px;background: url(Back-AQHA.jpg)' >"; 
    retStr = CSS + tableData.Content + "</body></html>"; 
    callback(retStr); 
}, null); 

Это умирает на линии sr.ReadToEnd(), как файл не может быть найден. Все права настроены правильно для меня, чтобы быть в состоянии получить доступ к каталогу активов и читать.

с просто контекст передается методу

Теперь, если предположить, что файл был быть прочитан и передается обратно вызывающий абонент, теперь он не может отображаться (тестировал это путем создания страницы в приложении и передать его обратно) ... код WebViewer является трясиной стандарта

public class webservice_webview : Activity 
{ 
    WebView web_view; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.webview); 
     string res = base.Intent.GetStringExtra("content"); 
     if (res.Length > 0) 
     { 
      web_view = FindViewById<WebView>(Resource.Id.webviewer); 
      web_view.Settings.JavaScriptEnabled = true; 
      web_view.LoadData(res, "text/html", null); 
      web_view.SetWebViewClient(new websiteviewClient()); 
     } 
     else 
      return; 
    } 

    private class websiteviewClient : WebViewClient 
    { 
     public override bool ShouldOverrideUrlLoading(WebView view, string url) 
     { 
      view.LoadData(url, "text/html", null); 
      return true; 
     } 
    } 

    public override bool OnKeyDown(Android.Views.Keycode keyCode, Android.Views.KeyEvent e) 
    { 
     if (keyCode == Keycode.Back && web_view.CanGoBack()) 
     { 
      web_view.GoBack(); 
      return true; 
     } 

     return base.OnKeyDown(keyCode, e); 
    } 
} 
} 

Когда содержание передается снова и визуализация, все это приводит к тому, что мертвая веб-страница говорит, что данные URL-адреса, текст/html; null, [сгенерированный html], возможно, были перемещены или ушли. Как получить отображаемую страницу?

Благодаря

Пол

ответ

0

Это может быть стоит проверить ваши активы находятся в папке активов и отмечены в панели свойств как «AndroidAsset» - также, пожалуйста, убедитесь, что капитализация является правильным.

Предполагая, что они, то вы можете просто передать активы прямо на WebView с помощью кода, как:

 var web = FindViewById<WebView>(Resource.Id.AboutWebView); 
     web.LoadUrl("file:///android_asset/About/index.html"); 

из https://github.com/slodge/mobile-samples/blob/master/MWC/MWC.Droid/Views/About/AboutXamarinView.cs

Если вы хотите читать и манипулировать HTML текст, а затем попробуйте код вроде: Assets.Open("About/index.html") - т.е. без файла: схема прилагается.

В вашем втором примере код для web_view.LoadData(res, "text/html", null); выглядит корректно - но тогда я не уверен, что делает ваша логика внутри ShouldOverrideUrlLoading - похоже, что это может просто предотвратить загрузку вещей?