Android(ICS):使用带有修改window.location的HTML / JS的loadData时,WebView无法显示

时间:2012-02-16 05:16:35

标签: android android-4.0-ice-cream-sandwich

在传递某个HTML有效负载时,我遇到了WebView的loadData方法的问题。有效负载包含一些JavaScript,它将window.location设置为具有自定义方案的URL(以下示例中为mycustomscheme://)。这样做的原因是我希望我的应用程序代码能够在shouldOverrideUrlLoading的实现中捕获各种JS事件。

在我的Galaxy Nexus设备(运行Ice Cream Sandwich)上,shouldOverrideUrlLoading按预期工作,但WebView并不会出现在屏幕上。如果我从JS中删除window.location代码,WebView就会显示出来。该代码似乎也适用于我尝试过的所有ICS前设备。

我在下面的代码中遗漏了一些明显的东西吗?

编辑:我可以使用addJavascriptInterface来完成同样的事情,但我不想这样做,因为并非所有的HTML都是由我生成的。为了保持代码示例的清晰度,我省略了这个细节。

public class ICSWebViewTestActivity extends Activity {
    private RelativeLayout mLayout;
    private WebView mWebView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLayout = new RelativeLayout(this);
        mLayout.setBackgroundColor(Color.RED);
        setContentView(mLayout);

        mWebView = new WebView(this);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setBackgroundColor(Color.GREEN);
        mWebView.setWebViewClient(new MyWebViewClient());

        String data = 
            "<html><head>" +
            "<script>" +
            "window.onload = f;" + // works if this line is removed
            "function f() { window.location = 'mycustomscheme://finish'; }" + 
            "</script>" +
            "</head>" +
            "<body><h1 style='color:blue'>Hello, world!</h1></body>";

        mWebView.loadData(data, "text/html", "utf-8");

        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        rlp.addRule(RelativeLayout.CENTER_IN_PARENT);

        mLayout.addView(mWebView, rlp);
    }

    private void doAction() {
        Toast.makeText(this, "Doing action!", Toast.LENGTH_SHORT).show();
    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.startsWith("mycustomscheme://")) {
                doAction();
            }
            return true;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

为什么不调用addJavascriptInterface到WebView,然后从javascript调用interfaceName,而不是设置window.location