【问题标题】:Handle URL from onCreateWindow WebView处理来自 onCreateWindow WebView 的 URL
【发布时间】:2020-06-03 04:00:15
【问题描述】:

我可以通过在WebView 上调用onCreateWindow 来获取网址吗?

@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture,
        Message resultMsg) {

}

【问题讨论】:

  • 注意:在某些情况下,URL 不足以正确加载新窗口。原窗口和新窗口之间可能还有其他链接,它们可能需要交换消息。在这种情况下,您似乎必须在与原始 webview 相同的活动中使用推荐的 transport.setWebView(newWebView); resultMessage.sendToTarget(); 方法。

标签: android webview


【解决方案1】:

您可以使用此代码获取点击的 URL。

@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture,
        Message resultMsg) {
    Message href = view.getHandler().obtainMessage();
    view.requestFocusNodeHref(href);

    String url = href.getData().getString("url");
    handleUrl(url); // handle the url here

    return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}

【讨论】:

  • 经常返回nullvlaue
  • 有时会得到javascript方法调用
  • href.getData() 始终是一个空包,因此 url 键始终为空。还有什么办法吗?
【解决方案2】:

试试这个。

@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture,
        Message resultMsg) {
    Logger.d(Constants.TAG, "onCreateWindow"+resultMsg);
    WebView targetWebView = new WebView(getActivity()); // pass a context
    targetWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                handleWebViewLinks(url); // you can get your target url here
                super.onPageStarted(view, url, favicon);
            }
    });
    WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
    transport.setWebView(targetWebView);
    resultMsg.sendToTarget();
    return true;
}

【讨论】:

    【解决方案3】:

    不需要开始加载网页的albeee's解决方案版本:

    @override
    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
        Logger.d(Constants.TAG, "onCreateWindow"+resultMsg);
        WebView targetWebView = new WebView(getActivity()); // pass a context
        targetWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading (WebView view, String url) {                   handleWebViewLinks(url); // you can get your target url here
                return true; // return false if you want the load to continue
            }
        });
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(targetWebView);
        resultMsg.sendToTarget();
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多