WebView中JS調用Android Method 遇到的坑整理


WebView是android中常用的一個組件,其作用是展示網頁,並讓網頁和android app進行一些業務邏輯上的交互。

其坑無數,相信用過的都知道,一個一個來解決吧。

1.怎么互調:

復制代碼
<!DOCTYPE>
<html>
<head>
    <meta charset="UTF-8">
    <script type="text/javascript">
        function android(bl){
            if(bl){
                document.getElementById("ap").innerHTML= "是true啊參數傳過來了"
            }else{
                document.getElementById("ap").innerHTML= "改變了段落的文字"
            }
        }
        function self(){
                document.getElementById("btn").innerHTML= "javascript改變按鈕文字"
        }
    </script>
</head>
<body>
    <div>
        <p id="ap">這是一個段落</p>
        <button onclick="window.hello.showAndroid()">點擊Toast</button>
        <button onclick="self()" id="btn">javascriptzi自己的方法</button>
    </div>
</body>
</html>
復制代碼

上面是js代碼 ,下面是android代碼:

復制代碼
public class MyWebViewtest extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webviewtest_layout);
        initView();
    }

    private void initView() {
        final WebView webView = (WebView) findViewById(R.id.my_web);
        webView.loadUrl("file:///android_asset/webviewtest.html");

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new JiaoHu(),"hello");

        Button btn = (Button) findViewById(R.id.get_js);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                webView.loadUrl("javascript:android(true)");
            }
        });
    }

    public class JiaoHu{
        @JavascriptInterface
        public void showAndroid(){
            Toast.makeText(MyWebViewtest.this,"js調用了android的方法",Toast.LENGTH_SHORT).show();
        }
    }
}
復制代碼
js調用android方式: <button onclick="window.hello.showAndroid()">點擊Toast</button>
hello指的是類(接口)的別名 ,在我們上面的代碼中也就是JiaoHu類 , showAndroid()是方法名,所以android和js要約定好的就是 類的別名 以及 方法名 即可調用成功。
android調用js方式:webView.loadUrl("javascript:android(true)");
android()為js中定義好的一個方法名,我們可以在android代碼中傳入一個參數true,在js中便能接收到,執行 document.getElementById("ap").innerHTML= "是true啊參數傳過來了" 這一句。

2.坑之一(webview中js的方法不能執行):

web組的同事在采用 ajax 框架請求后台數據的時候,我這里則無法顯示,原因少了一句話:

webView.getSettings().setDomStorageEnabled(true);  //很關鍵!!!!

這句代碼讓android能讀取js的節點,也就可以執行了

3.坑之二(webView中h5變形記):

我們做的活動是類似於這樣的

 

 然鵝,當點擊了輸入框,彈出軟鍵盤,變成這樣的:

沒錯,媽的變形了(變形記),這個需要前端同事將window的高度設置為定長(之前height=100%)

 var HEIGHT = $('body').height();
        $(window).resize(function() {
            $('.main').height(HEIGHT);
        });

可以的,這個解決了。

坑之三(js中操作android的UI了 導致 java.lang.IllegalStateException: Calling View methods on another thread than the UI thread.at 異常):

這是最惡心的,沒有之一,之前沒遇到過。

我們活動中要集成umeng分享,分享到微信,分享到朋友圈都沒有問題(更神奇的是做的時候還是ok的,提交給測試的時候就變卦了,日了狗了)。

涉及到一個操作UI的問題,那我們肯定要將js調用我們的代碼放在UI線程中啊

runOnUiThread(new Runnable() {
    @Override 
    public void run() { 
        // Code for WebView goes here 
    } 
}); 

這個自然沒問題,也就是要把我們注解的方法的內容放在UI線程中跑,但是你的 類 你的 接口 他不是Activity啊 沒有runOnUiThread方法啊 。

急中生智,讓我們的類 繼承 Activity 

public class FreeFlowInterface extends Activity

ok,現在就可以了,然后在這么一來

復制代碼
@JavascriptInterface
    public void shareToFriend(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = drawableToBitmap(R.drawable.sharepic);
                mShareController = UmengShareUtils.share(activity,mShareController,shareTitle,shareContent,targetUrl,bitmap);
            }
        });
    }
復制代碼

坑真的不少,且行且小心。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM