Android中的Webview - JavaScript回调不起作用?

4
我将使用WebView在Android应用程序上显示网页。https://developer.android.com/guide/webapps/webview.html 在HTML中单击按钮后,我可以成功进入Android类WebAppInterface(来自示例)并显示“Toast”警报,但尝试回调到我的网页中定义的javascript函数不起作用。
这是网页代码:(Android.html)
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />

<script type="text/javascript">
    function showAndroidToast(toast) {
        if (typeof Android != 'undefined') 
            Android.showToast(toast);       


    }

    function ChangeColor()
    {
        document.body.style.background = 'pink';
    }
</script>

这是Android应用程序MainActivity的代码。它加载URL并显示它。
public class MainActivity extends AppCompatActivity {

    WebView m_Webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        m_Webview = (WebView) findViewById(R.id.webview);

        WebSettings webSettings = m_Webview.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        m_Webview.setWebViewClient(new WebViewClient());
        m_Webview.loadUrl("android.html");


        WebView webView = (WebView) findViewById(R.id.webview);
        webView.addJavascriptInterface(new WebAppInterface(this,webView), "Android");
    }
}

这是 Android 应用中的 WebAppInterface:

public class WebAppInterface {

    Context mContext;
    WebView mView;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c,WebView w) {
        mContext = c;
        mView = w;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        mView.loadUrl("javascript:ChangeColor()");
    }
}

JavaScript函数ChangeColor在显示Toast后没有被调用。
更多参考请见:https://dev59.com/32w05IYBdhLWcg3wy052#14145116 谢谢!
1个回答

4
解决方案是使用"post"函数,如下所示:
public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
      //  WebView Web = new WebView(mContext);
       // mView.getSettings().setUserAgentString("Android WebView");
        mView.post(new Runnable() {
            public void run() {
                mView.loadUrl("javascript:ChangeColor()");
            }
        });
    }

从KitKat及以后版本开始,您需要使用evaluateJavascript

mView.evaluateJavascript("ChangeColor();",null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接