Ich möchte einen Java-Code in meiner Android-App synchron aufrufen.
Ich verwende diese Lösung: https://stackoverflow.com/a/3338656
Mein Java-Code:
final class MyWebChromeClient extends WebChromeClient {
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("LogTag", message);
result.confirm();
return true;
}
}
Mein JavaScript-Code:
<html>
<script>
function java_request(){
alert('test');
}
</script>
<body>
<h2>Welcome</h2>
<div id="area"></div>
<form>
<input type="button" value="java_call" onclick="java_request()">
</form>
</body>
</html>
Wenn ich auf die java_call
Schaltfläche tippe, wechselt die Schaltfläche in den gedrückten Zustand. Ich kann 'test'
im Konsolenprotokoll sehen. Bis hier ist alles normal.
Das Problem ist, dass die Taste nie wieder in ihren normalen Zustand zurückkehrt. Es bleibt im gedrückten Zustand. Vielleicht ist die JavaScript-Ausführung kaputt oder so?
Warum kehrt die Schaltfläche nie in ihren normalen Zustand zurück?
quelle
Ihre Funktion gibt 'true' zurück. Dadurch ist die Eigenschaft "onclick" Ihres HTML-Codes gleich "true", sodass die Schaltfläche "angeklickt" bleibt.
quelle
Bei den in der Klasse " YourJavaScriptInterface " definierten Methoden vergessen Sie nicht, jede Methode, die Sie verfügbar machen möchten, mit "@JavascriptInterface" zu versehen, da sonst die Methode nicht ausgelöst wird.
Der folgende Code stammt beispielsweise aus der Google Cloud Print JavaScript-Oberfläche für Anrufe von einer Webview-Seite:
final class PrintDialogJavaScriptInterface { @JavascriptInterface public String toString() { return JS_INTERFACE; } @JavascriptInterface public String getType() { return cloudPrintIntent.getType(); } @JavascriptInterface public String getTitle() { return cloudPrintIntent.getExtras().getString("title"); } @JavascriptInterface public String getContent() { try { ContentResolver contentResolver = getActivity().getContentResolver(); InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int n = is.read(buffer); while (n >= 0) { baos.write(buffer, 0, n); n = is.read(buffer); } is.close(); baos.flush(); return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; } @JavascriptInterface public String getEncoding() { return CONTENT_TRANSFER_ENCODING; } @JavascriptInterface public void onPostMessage(String message) { if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) { finish(); } } }
quelle