【问题标题】:Accessing Activity Methods from WebChromeClient从 WebChromeClient 访问 Activity 方法
【发布时间】:2015-06-15 16:19:32
【问题描述】:

我正在使用 Xamarin 编写一个 Android 应用程序,在该应用程序中,我有一个 webview 需要在创建应用程序时加载,在它完全加载后,我将一些 javascript 调用到 HTML 页面中进行设置图表。

我正在尝试使用自定义WebChromeClient 来覆盖OnProgressChanged 方法,当它完全加载时,它会调用我的MainActivity 中的一个方法。

这里是MainActivity 代码:

using System;
using System.Text;
using System.Timers;
using System.Collections;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Text;
using Android.Text.Style;
using Android.Webkit;

public class MainActivity : Activity
{
     WebView graph;

     protected override void OnCreate (Bundle bundle)
     {
          base.OnCreate (bundle);
          SetContentView (Resource.Layout.Main);

          graph = FindViewById<WebView>(Resource.Id.webGraph);

          //Initializes the WebView
          graph.SetWebChromeClient(new myWebChromeClient()); 
          graph.Settings.JavaScriptEnabled = true;
          graph.LoadUrl("file:///android_asset/graph.html");

我创建的myWebChromeClient 类看起来像这样:

class myWebChromeClient : WebChromeClient
{
     public override void OnProgressChanged(WebView view, int newProgress)
     {
          base.OnProgressChanged(view, newProgress);

          if (newProgress == 100) {MainActivity.setUpGraph();}
     }
}

myWebChromeClientMainActivity 内,但我无法访问setUpGraph 方法,即使它是公共方法。

任何帮助将不胜感激!

【问题讨论】:

  • MainActivity.setUpGraph() - 这是一个静态方法吗?如果不是,您需要在 MainActivity 的实例上调用它,而不是类本身。
  • 它不是静态的,并且采用特定于 MainActivity 类的参数。如何访问 MainActivity 的实例及其当前正在运行的成员?

标签: javascript android xamarin webchromeclient


【解决方案1】:

在 myWebChromeClient 类中接受并存储 MainActivity 类型的引用。 只有这样才能调用 MainActivity 中的 setUpGraph() 函数。

编辑

myWebChromeClient 类:

class myWebChromeClient : WebChromeClient
{
     public MainActivity activity;
     public override void OnProgressChanged(WebView view, int newProgress)
     {
          base.OnProgressChanged(view, newProgress);

          if (newProgress == 100) { activity.setUpGraph(); }
     }
}

还有活动:

    public class MainActivity : Activity
    {
         WebView graph;

         protected override void OnCreate (Bundle bundle)
         {
              base.OnCreate (bundle);
          SetContentView (Resource.Layout.Main);

          graph = FindViewById<WebView>(Resource.Id.webGraph);

          //Initializes the WebView
          myWebChromeClient client = new myWebChromeClient(); 
          client.activity = this;
          graph.SetWebChromeClient(client); 
          graph.Settings.JavaScriptEnabled = true;
          graph.LoadUrl("file:///android_asset/graph.html");

为简单起见,我在客户端添加了一个公共变量,请不要在生产中使用相同的变量。在构造函数中传递引用或使用 get-set。

【讨论】:

  • 我该怎么做?
  • 谢谢!这解决了它。
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2011-10-31
  • 1970-01-01
  • 2015-05-24
相关资源
最近更新 更多