2015-04-30 38 views
1

我在WebView中运行了一些JavaScript。在这个Javascript代码中有一个返回布尔值的函数。我想检查这个函数的返回值,并依赖它隐藏或不在我的android代码中的视图。我尝试了一天,它不起作用。有人知道我的错误在哪里吗?这是我的代码:在WebView中调用Android方法的Javascript

public class MyActivity extends Activity { 
    private static final String JS_INTERFACE = "Android"; 
    .... 

    webView.getSettings().setJavaScriptEnabled(true); 
    webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
    webView.loadUrl(getUrl(this.getResources().getString(R.string.host))); 
    webView.addJavascriptInterface(new WebViewJavaScriptInterface(this), JS_INTERFACE); 
    webView.setWebViewClient(new WebViewClient(progressBar, this, tvError)); 
    webView.setWebChromeClient(new WebChromeClient(progressBar)); 

    webView.loadUrl("javascript:window.Android.showAdBanner(showSdkAd())"); 
} 

public class WebViewJavaScriptInterface 
{ 
    .... 
    @JavascriptInterface 
    public void showAdBanner(String jsResult) { 
     if (jsResult == "true") { 
      ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE); 
     } else { 
      ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE); 
     } 
    } 
} 
+0

什么是'showSdkAd()'? –

+0

这是返回一个布尔值的javascript函数,以了解是否必须隐藏视图 – IrApp

+0

if(jsResult ==“true”)'should'if(jsResult == true)' –

回答

1

你在if (jsResult == "true") if语句的这两种情况下的可见性设置为View.GONE

我觉得在JS的window是不需要的,所以

webView.loadUrl("javascript:window.Android.showAdBanner(showSdkAd())");

应该

webView.loadUrl("javascript:Android.showAdBanner(showSdkAd())");

此外,JavaScript回调会在后台线程中执行,所以你在执行UI操作之前,需要移动到主线程(将runnable发布到视图,runOnUiThread,使用处理程序等)。

如果你有一个视图的引用,你可以这样做:

@JavascriptInterface 
public void showAdBanner(String jsResult) { 
    viewReference.post(new Runnable() { 
     public void run() { 
      if (jsResult == "true") { 
       ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE); 
      } else { 
       ((Activity) context).findViewById(R.id.adView).setVisibility(View.GONE); 
      } 
    } 
} 

因为,你有活性的参考,你可以用((Activity) context).runOnUiThread

取代viewReference.post如果在初始化处理程序主线程,它将被绑定到主线程。作为活动的一个领域,你可以有:

private Handler mHandler = new Handler(); 

然后用mHandler.post 取代viewReference.post你也可以将实现handleMessage(Message msg)自定义处理程序,然后你可以只发送一个空的消息。但是,您应该阅读https://techblog.badoo.com/blog/2014/08/28/android-handler-memory-leaks/以避免内存问题。

+0

是的,你是对的,但这是因为在xml中是可见的,它只是用于测试,无论如何改变visibity以知道回调工作。 – IrApp

+0

啊,我看到了,以为你期待它被显示..更新我的回答 – FunkTheMonk

+0

我也试过这个答案,但它不工作 – IrApp

相关问题