Android - 如何在 Android WebView 中使用 Javascript?
Android - How to use Javascript in an Android WebView?
我的 Hybrid Android 有问题 App.I 需要一个带有 HTML 的 WebView,而在这个 HTML 我有一个按钮。
我有一个带有 WebView 的布局,我在 HTML 中有一个按钮,我试图在另一个屏幕(也是一个带有 WebView 的布局)上启动第二个 Activity用户单击此按钮。
我的问题是这个按钮没有启动第二个 activity。
我正在使用 Cordova。
这是我的布局(pruebas.xml
):
<?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();
}
}
}
这是我的第二个 activity (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
,另一个HTML(description-long.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>
这是我在 assets/www
中的 changeactivity.js
文件:
function displaymessage(){
JSInterface.changeActivity();
}
document.addEventListener('DOMContentReady', function () {
document.getElementById('changeactivity').addEventListener('click', displaymessage);
});
有什么建议吗?我查看了这些帖子:
基于Binding JavaScript documentation
Note: The object that is bound to your JavaScript runs in another thread and not in the thread in which it was constructed.
您正在 non-UI 线程上启动 activity。您应该 运行 它在 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();
}
});
}
或者您也可以使用处理程序。
我的 Hybrid Android 有问题 App.I 需要一个带有 HTML 的 WebView,而在这个 HTML 我有一个按钮。
我有一个带有 WebView 的布局,我在 HTML 中有一个按钮,我试图在另一个屏幕(也是一个带有 WebView 的布局)上启动第二个 Activity用户单击此按钮。
我的问题是这个按钮没有启动第二个 activity。
我正在使用 Cordova。
这是我的布局(pruebas.xml
):
<?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();
}
}
}
这是我的第二个 activity (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
,另一个HTML(description-long.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>
这是我在 assets/www
中的 changeactivity.js
文件:
function displaymessage(){
JSInterface.changeActivity();
}
document.addEventListener('DOMContentReady', function () {
document.getElementById('changeactivity').addEventListener('click', displaymessage);
});
有什么建议吗?我查看了这些帖子:
基于Binding JavaScript documentation
Note: The object that is bound to your JavaScript runs in another thread and not in the thread in which it was constructed.
您正在 non-UI 线程上启动 activity。您应该 运行 它在 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();
}
});
}
或者您也可以使用处理程序。