我正在使用webview制作一个Android应用。 该应用程序可以打印出收据。我想做的是当打印机不工作时,出现警告框,告诉打印机不工作,并向表单的onsubmit事件返回false,以防止提交表单。
Java代码:
public class JSKicker {
@JavascriptInterface
public void callPrint(final String argumet) {
Thread thread = new Thread(new Runnable() {
public void run() {
int nRtn;
connectionNum = myPrinter.Connect("000.000.0.000");
if(connectionNum < 0){ //Printer not working
webview.post(new Runnable() {
@Override
public void run() {
String script = "alert('Printer Error'); return printer_connection = false;";
webview.evaluateJavascript(script, new ValueCallback<String>() {
@Override
// I can't figure out what to do here...
});
}
});
}else{ //Printer is working properly
connectionNum = myPrinter.SetLocale(8);
strText = argument;
nRtn = myPrinter.PrintText(strText, "SJIS");
nRtn = myPrinter.PaperFeed(64);
nRtn = myPrinter.CutPaper(1);
myPrinter.Disconnect();
}
}
});
thread.start();
}
标头中的JavaScript:
<script type="text/javascript">
function gate(){
jQuery.ajax({
url:'/cart_info.php',
type:'GET'
})
.done( (data) => {
window.JSKicker.callPrint(data);
})
if (printer_connection = false) {
return false;
}else{
return true;
}
}
</script>
HTML表单标签:
<form method="post" id="order_form" onsubmit="return gate();">
我如何获得这项工作?
答案 0 :(得分:0)
您可以通过WebView.evaluateJavascript()吗?
因此,您可以将简单的CustomEvent发送到WebView中的文档
(1,0)
(1,0)
(1,0)
(1,0)
并且在JavaScript中,您可以挂接侦听器以对您的自定义事件做出反应。
webView.evaluateJavascript("document.dispatchEvent(new Event('printer_error', { details: "No printer found!" }));");
没有对此进行测试,因此至少evaluateJavascript()需要回调函数。
答案 1 :(得分:0)
WebSocket可以解决您的问题。
WebSockets在客户端和服务器之间提供持久的连接,双方都可以使用该连接随时开始发送数据。客户端通过称为WebSocket握手的过程建立WebSocket连接。
它非常简单并且易于实现。
您可以点击引荐链接以获取更多详细信息:-
JAVA WebSocket:-WebSocket using Spring Boot,WebSocket using Simple JEE
浏览器WebSocket(JavaScript):-WebSocket API
答案 2 :(得分:0)
在Android中,如果您希望webview将值传递给JavaScript。 首先,您需要将webview设置为启用JavaScript,
private WebView mWebView;
void onCreate(){
mWebView = findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
}
然后,在您想要做的事情代码中
if(connectionNum < 0){ //Printer not working
// I need to do something here to send a message that the printer isn't working to JS.
//In thread can not use mWebView,should send message to MainThread to do
// mWebView.loadUrl("javascript:javaCall()");
Message msg = new Message();
msg.what = 1;
myHandler.sendMessage(msg);
//myHandler can be your MainThread send to here
}
在代码中创建的mWebView所在的主线程中,您可以使用 处理发送到此处的消息的处理程序。
private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// this 1 is just thread send to here
if (msg.what == 1) {
//and here can do the webview UI method
mWebView.loadUrl("javascript:javaCall()");
}
}
};
javaCall()是JacaScript调用方法的地方,在javaScript中,您可以这样写:
<script language="javascript">
function javaCall(){
alert("Printer Error");
//other thing you can do
}
</script>
如果有问题,可以参考正式文件。
public void loadUrl (String url)
Loads the given URL.
Also see compatibility note on evaluateJavascript(String, ValueCallback).