我的混合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>
有什么建议吗?我查看这些帖子:
答案 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();
}
});
}
或者您也可以使用处理程序。