2015-04-30 39 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

相關問題