在 web 视图中重写 window.print()

Dee*_*pti 6 html java webview

由于 webview 不支持 javascript 函数window.print(),因此我尝试重写它,如此处所述。简而言之,提到的解决方案是:“注入 JavaScript 来覆盖 window.print() 并调用 JavaScriptInterface 方法”

因此,我做了以下操作:
1)在创建和初始化 webview 的地方添加了以下方法调用:

tab.getWebView().loadUrl("javascript:window.print = function() {console.log('Gonna do some special "
                    + "stuff!!');"
                    + "alert(\"Printing\"); customPrint.print();}");
Run Code Online (Sandbox Code Playgroud)

2)创建Web应用程序界面

public class WebAppInterface
        {
            @JavascriptInterface
            public void print()
            {
                Toast.makeText(activityInstance, "print called", Toast.LENGTH_SHORT).show(); 
            }
        }
Run Code Online (Sandbox Code Playgroud)


3)将上面创建的接口添加到初始化webview的代码中:

mWebView.addJavascriptInterface(new WebAppInterface(), "customPrint");
Run Code Online (Sandbox Code Playgroud)

当我的网页在同一窗口中没有 window.print() 时,这工作正常。一些 html 的 onClick() 是这样的:

 function myFunction() { window.print(); }
Run Code Online (Sandbox Code Playgroud)

但当 myFunction() 被替换为如下内容时,将无法工作:

var sUrl="www.google.com";
    var ctrlString="Hello world";
    var wind = window.open(sUrl,"PrintWindow",ctrlString);
    wind.document.write("<html><head><meta name=\"viewport\" 
    content=\"width=device-width\" /><style>html, body, p {font-size: 20px; 
    width: 100%; display: block; margin: 2px; padding: 1px; }</style> . 
    </head><body><p>Hello world.</p></body></html>");
    var tempTitle = document.title;
    wind.document.title = sUrl;     
    wind.print();
    wind.document.title = tempTitle;
    wind.close();
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为当在网页上单击打印时我们正在打开新窗口。在我的例子中,我们在打开新窗口时打开一个新的网页视图,该窗口再次初始化。虽然我认为在创建新的 webview 时添加 web 界面应该可行,但在我的情况下它不起作用。需要弄清楚这种情况下可能出了什么问题吗?