Передача значения из Java в Javascript - PullRequest
0 голосов
/ 16 октября 2018

Я делаю приложение для Android, используя webview.Приложение может распечатать квитанции.Что я хочу сделать, так это когда принтер не работает, появляется окно с предупреждением о том, что принтер не работает, и возвращает false для события onsubmit формы, чтобы предотвратить отправку формы.

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();">

Как я могу получить эту работу?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

WebSocket может решить вашу проблему.

WebSockets обеспечивает постоянное соединение между клиентом и сервером, которое обе стороны могут использовать для начала отправки данных в любое время.Клиент устанавливает соединение WebSocket с помощью процесса, известного как рукопожатие WebSocket.

Это очень просто и легко реализуемо.

Вы можете перейти по ссылкам реферера для более подробной информации: -

JAVA WebSocket: - WebSocket с использованием Spring Boot , WebSocket с использованием Simple JEE

Браузер WebSocket (JavaScript): - WebSocket API

0 голосов
/ 16 октября 2018

В Android, если вы хотите, чтобы webview передавал значение в JavaScript.Во-первых, вам нужно настроить поддержку веб-просмотра 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).

ссылка для просмотра веб-сайта

0 голосов
/ 16 октября 2018

Не могли бы вы сделать это через WebView.evaluateJavascript ()?

https://developer.android.com/reference/android/webkit/WebView.html#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback%3Cjava.lang.String%3E)

Таким образом, вы можете отправить простое CustomEvent в документ в WebView

webView.evaluateJavascript("document.dispatchEvent(new Event('printer_error', { details: "No printer found!" }));");

а в JavaScript вы можете перехватить прослушиватель, чтобы ваше пользовательское событие реагировало.

document.addEventListener('printer_error', e => alert(e.details));

Это не проверялось, так что, возможно, по крайней мере для valuJavascript () требуется функция обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...