Android - 如何在Android WebView中使用Javascript?

时间:2018-03-30 10:43:23

标签: javascript android cordova android-webview phonegap

我的混合Android应用程序中存在问题。我需要一个带有HTML的WebView,在这个HTML中我有一个按钮。

我有一个带有WebView的布局,我在HTML中有一个按钮,我试图在用户单击此按钮时用另一个屏幕(也是带有WebView的布局)启动第二个Activity。

我的问题是这个按钮没有启动第二个活动。

我正在使用Cordova。

这是我的布局(<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/textView" /> </LinearLayout> ):

MainActivity.java

这是我的public class MainActivity extends CordovaActivity{ WebView wv; JavaScriptInterface JSInterface; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); setContentView(R.layout.pruebas); wv = (WebView)findViewById(R.id.webview); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setDomStorageEnabled(true); // register class containing methods to be exposed to JavaScript JSInterface = new MainActivity.JavaScriptInterface(this); wv.addJavascriptInterface(JSInterface, "JSInterface"); wv.loadUrl("file:///android_asset/www/description.html"); } public class JavaScriptInterface { Context mContext; /** Instantiate the interface and set the context */ JavaScriptInterface(Context c) { mContext = c; } @android.webkit.JavascriptInterface public void changeActivity(){ Intent i = new Intent(MainActivity.this, JavascriptInterfaceActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); finish(); } } }

JavascriptInterfaceActivity.java

这是我的第二项活动(public class JavascriptInterfaceActivity extends Activity { WebView wv; JavaScriptInterface JSInterface; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); setContentView(R.layout.pruebas); wv = (WebView)findViewById(R.id.webview); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setDomStorageEnabled(true); JSInterface = new JavaScriptInterface(this); wv.addJavascriptInterface(JSInterface, "JSInterface"); wv.loadUrl("file:///android_asset/www/description-long.html"); } public class JavaScriptInterface { Context mContext; /** Instantiate the interface and set the context */ JavaScriptInterface(Context c) { mContext = c; } @android.webkit.JavascriptInterface public void changeActivity(){ Intent i = new Intent(JavascriptInterfaceActivity.this, MainActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); finish(); } } } ):

description.html

这是description-long.html,其他HTML(<!DOCTYPE html> <html> <head> <script src='changeactivity.js'></script> <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *"> <meta name="format-detection" content="telephone=no"> <meta name="msapplication-tap-highlight" content="no"> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"> <link rel="stylesheet" type="text/css" href="css/index.css"> <title>Main activity</title> </head> <body> <button id='changeactivity'>Changue activity</button> </body> </html> )类似:

changeactivity.js

这是assets/www中的 function displaymessage(){ JSInterface.changeActivity(); } document.addEventListener('DOMContentReady', function () { document.getElementById('changeactivity').addEventListener('click', displaymessage); }); 文件:

<body>

 <form name="submit-to-google-sheet" class="pure-form pure-form-stacked">
 <fieldset>
  <input name="Date" type="Date" placeholder="Date" >
  <input name="Client" type="name" placeholder="Client">
  <input name="Artist" list="artist" placeholder="Artist">
	<datalist id="artist">
		<option value="Clyde">
		<option value="Eazy">
		<option value="Ale">
		<option value="Andy">
		<option value="Jaz">
		<option value="Geust">
	</datalist>

  <input name="Percentage" id="%" type="number" min="0.4" max="1" step="0.1" placeholder="Percentage" >

  <input name="Depost" id="depost" type="number" placeholder="Depost">
  <input name="Daycost" id="daycost" type="number" placeholder="Daycost">
    <input name="Jaz Artist" id="jaza" type="number" placeholder="Jaz Artist" >
  <input name="Jaz House" id="jazh" type="number" placeholder="Jaz House">
 <br><br>
  <button type="submit">Send</button>
  </fieldset>
</form>
<br><br>
<br>
    <div class="loading js-loading is-hidden">
      <div class="loading-spinner">
        <svg><circle cx="25" cy="25" r="20" fill="none" stroke-width="2" stroke-miterlimit="10"/></svg>
      </div>
    </div>
		<div class="js-success-message is-hidden">
			<h1>Tattdatt Tattoo</h1>
			<button type="reset" onclick="output();">Math</button>
			<h3>ARTIST CUT</h3>
			<h4 id="artistcut">$$$ </h4>
			<h3>HOUSE CUT</h3>
			<h4 id="housecut">$$$ </h4>
		</div>
    <p class="js-error-message is-hidden">Error!</p>
  </div>

  <script>
    const scriptURL = 'https://script.google.com/macros/s/AKfycbwlQn8LAFp7gmY8ifWdr5sjUtb1CHi3Z2d2O06fDcYLm3YFCMrX/exec'
    const form = document.forms['submit-to-google-sheet']
    const loading = document.querySelector('.js-loading')
    const successMessage = document.querySelector('.js-success-message')
    const errorMessage = document.querySelector('.js-error-message')
    form.addEventListener('submit', e => {
      e.preventDefault()
      showLoadingIndicator()
      fetch(scriptURL, { method: 'POST', body: new FormData(form)})
        .then(response => showSuccessMessage(response))
        .catch(error => showErrorMessage(error))
    })
    function showLoadingIndicator () {
      form.classList.add('is-hidden')
      loading.classList.remove('is-hidden')
    }
    function showSuccessMessage (response) {
      console.log('Success!>', response)
      setTimeout(() => {
        successMessage.classList.remove('is-hidden')
        loading.classList.add('is-hidden')
      }, 500)
    }
    function showErrorMessage (error) {
      console.error('Error!', error.message)
      setTimeout(() => {
        errorMessage.classList.remove('is-hidden')
        loading.classList.add('is-hidden')
      }, 500)
    }
  </script>
<script type="text/javascript" language="javascript" charset="utf-8">

function output(){

	var depost = parseFloat(document.getElementById('depost').value);
    var daycost = parseFloat(document.getElementById('daycost').value);
	var percent = parseFloat(document.getElementById('%').value);
    var jaza = parseFloat(document.getElementById('jaza').value);
	var jazh = parseFloat(document.getElementById('jazh').value);

    document.getElementById('artistcut').innerHTML = (depost + daycost) * percent - jaza;
    document.getElementById('housecut').innerHTML = ((depost + daycost) * percent) - jazh;

}

</script>
</body>

有什么建议吗?我查看这些帖子:

https://stackoverflow.com/a/10481108/3739382

https://stackoverflow.com/a/31631068/3739382

1 个答案:

答案 0 :(得分:1)

基于Binding JavaScript documentation

  

注意:绑定到JavaScript的对象在另一个线程中运行,而不是在构造它的线程中运行。

您正在非UI线程上启动活动。您应该在UI线程上运行它,如下所示:

@android.webkit.JavascriptInterface
    public void changeActivity(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                 Intent i = new Intent(MainActivity.this, JavascriptInterfaceActivity.class);
                 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                 startActivity(i);
                 finish();
            }
        });

    }

或者您也可以使用处理程序。