Xamarin.Forms пытается связаться между JavaScript и C# - PullRequest
0 голосов
/ 14 апреля 2020

ОК ... поэтому у меня есть пользовательский HTMLWebview, к которому я хочу добавить Javascript. Многие примеры, которые я нахожу в Интернете, имеют уровень HTML на Android (и iOS), но я бы предпочел сохранить HTML в пользовательском рендерере (таким образом, я могу заполнить его пользовательским контентом на отдельных страницах) ,

Сейчас у меня есть кнопка, которая должна запускать событие, но оно не происходит, и я не уверен, почему.

Это мой пользовательский рендерер:

    public class HybridWebView : WebView
    {
        public HybridWebView()
        {
            const string html = @"
        <html>
          <body>
            <h3>Test page</h3>
            <button type=""button"" onClick=""CSharp.ShowToast('Hello from JS')"">Native Interaction</button>
          </body>
        </html>";

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

            htmlSource.Html = html;
            Source = htmlSource;
        }
    }

Это мой Android Рендерер:

[assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebViewRenderer))]
namespace Test.Droid.Renderers
{
    public class HybridWebViewRenderer : WebViewRenderer
    {

        Context _context;
        public HybridWebViewRenderer(Context context) : base(context)
        {
            _context = context;
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {

            if (Control != null)
            {
                Control.Settings.JavaScriptEnabled = true;
                Control.AddJavascriptInterface(new HybridJSBridge(Android.App.Application.Context), "CSharp");

            }

            base.OnElementPropertyChanged(sender, e);
        }

    }
}

Это мой мост:

    public class HybridJSBridge : Java.Lang.Object
    {
        Context context;

        public HybridJSBridge(Context context)
        {
            this.context = context;
        }

        [JavascriptInterface]
        [Export]
        public void ShowToast(string msg)
        {
            Toast.MakeText(context, msg, ToastLength.Short).Show();
        }

    }

Сейчас при нажатии кнопки ничего не происходит. Я надеюсь, что кто-то может указать мне правильное направление? Заранее спасибо!

1 Ответ

0 голосов
/ 15 апреля 2020

Хотите ли вы добиться результата, подобного следующему GIF?

enter image description here

Я не знаю, какое значение BaseUrl в htmlSource.BaseUrl = DependencyService.Get<IBaseUrl>().Get();, Если я установлю значение return "file:///android_asset";

[assembly: Dependency(typeof(BaseUrl_Android))]
namespace WebviewInvokeJS.Droid
{
    class BaseUrl_Android : IBaseUrl
    {
        public string Get()
        {
            //throw new NotImplementedException();

            return "file:///android_asset";
        }
    }
}

и добавлю Control.SetWebViewClient(new WebViewClient()); в HybridWebViewRenderer, это сработает.

[assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebViewRenderer))]
namespace WebviewInvokeJS.Droid
{

    public class HybridWebViewRenderer : WebViewRenderer
    {
        Context _context;
        public HybridWebViewRenderer(Context context) : base(context)
        {
            _context = context;
        }
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {

            if (Control != null)
            {
                Control.Settings.JavaScriptEnabled = true;
                Control.AddJavascriptInterface(new HybridJSBridge(Android.App.Application.Context), "CSharp");
               Control.SetWebViewClient(new WebViewClient());
            }

            base.OnElementPropertyChanged(sender, e);
        }
    }


}

Вы также можете загрузить мое демо, чтобы выполнить тест.

https://github.com/851265601/XFormsWebviewInvokeJS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...