我正在尝试制作一个相对简单的iOS应用的Android版本,它使用webview,一些按钮然后依赖于对CMS的javascript调用。
但是我很早就陷入了困境:webview无法使用javascript。我已经阅读了很多关于如何在Android webview中启用JS的帖子,但到目前为止还没有运气。
以下是我的一些代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new HelloWebViewClient()
{
@Override
public void onPageFinished(WebView view, String url)
{
//Calling an init method that tells the website, we're ready
mWebView.loadUrl("javascript:m2Init()");
page1(mWebView);
}
});
mWebView.loadUrl("http://my_url/mobile/iphone//app.php");
}
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
public void page11(View view)
{
mWebView.loadUrl("javascript:m2LoadPage(1)");
}
我在这里做错了什么? 该URL在我的iOS应用程序和浏览器中运行良好。 但不是在我的应用程序!
请告诉我这是明显的......
答案 0 :(得分:89)
修复!
在错误的刺激下,我发现我需要设置setDomStorageEnabled(true)
用于webview设置。
感谢您的帮助斯蒂芬:)
答案 1 :(得分:30)
如果Android上的WebView无法正常工作,我总是尽量确保设置这些疯狂的标志,例如,
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
webSettings.setSupportZoom(true);
webSettings.setDefaultTextEncodingName("utf-8");
我想知道为什么这些不是默认设置的,谁会期望现在没有javascript内容的网页,以及当DOM不可用时启用javascript的用法除非另有说明。希望有人将此作为错误或改进/功能请求提交,并且猴子正在努力。
然后有一些被弃用的东西腐烂了,就像这样:
webView.getSettings().setPluginState(PluginState.ON);
这一切都是为了在app中加载网页。
在iOS上,它如此简单 - Swift 3.0
private func openURLWithInAppBrowser(urlString:String) {
guard let url = URL(string:urlString) else {
return
}
let sfSafari = SFSafariViewController(url:url)
present(sfSafari, animated: true, completion: nil)
}
答案 2 :(得分:5)
您是否在清单中启用了正确的互联网权限?否则一切看起来都不错。你有没有机会在真正的Android手机上测试过这段代码?而不只是在模拟器上?
这是good tutorial略有不同的方法。您可能想尝试一下,看看它是否适合您。
答案 3 :(得分:5)
在webview中加载javascript
webView.getSettings().setDomStorageEnabled(true);
答案 4 :(得分:3)
主要,这三行代码足以使Javascipt在webView中工作...
webSetting.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
如果在此之后仍然无法使用,请在下面的行中添加。
webSettings.setDomStorageEnabled(true);
实际上,您需要setJavaScriptEnabled()和setWebChromeClient(new WebChromeClient())才能使JavaScript正常工作。如果仅使用webSetting.setJavaScriptEnabled(true);那就行不通了。
答案 5 :(得分:2)
Xamarin Android也存在相同的问题,即WebView不执行任何Javascript。遵循@computingfreak答案:
this.SetContentView(Resource.Layout.activity_main);
var webView = this.FindViewById<WebView>(Resource.Id.webView);
var webSettings = webView.Settings;
webSettings.JavaScriptEnabled = true;
webSettings.DomStorageEnabled = true;
webSettings.LoadWithOverviewMode = true;
webSettings.UseWideViewPort = true;
webSettings.BuiltInZoomControls = true;
webSettings.DisplayZoomControls = false;
webSettings.SetSupportZoom(true);
webSettings.DefaultTextEncodingName = "utf-8";
奇怪的是,他们将所有setter方法更改为属性,除了SetSupportZoom
和SupportZoom
仍然是getter:/
答案 6 :(得分:1)
这段视频(http://youtu.be/uVqp1zcMfbE)给了我提示让它发挥作用。
关键是要将您的html
和js
文件保存在Android assets/
文件夹中。
然后您可以通过以下方式轻松访问它们:
webView.loadUrl("file:///android_assets/your_page.html");
答案 7 :(得分:0)
只需允许 WebView 运行JS,就像这样简单:
WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);
答案 8 :(得分:0)
要在WebView中启用javascript弹出窗口,必须设置 webChromeClient 并覆盖 openFileChooser 方法。
mWebview.setWebChromeClient(new WebChromeClient(){
// For Android 4.1+
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType(acceptType);
startActivityForResult(Intent.createChooser(i, "SELECT"), 100);
}
// For Android 5.0+
@SuppressLint("NewApi")
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (mUploadMessageArr != null) {
mUploadMessageArr.onReceiveValue(null);
mUploadMessageArr = null;
}
mUploadMessageArr = filePathCallback;
Intent intent = fileChooserParams.createIntent();
try {
startActivityForResult(intent, 101);
} catch (ActivityNotFoundException e) {
mUploadMessageArr = null;
Toast.makeText(activity,"Some error occurred.", Toast.LENGTH_LONG).show();
return false;
}
return true;
}
});
并按如下所示处理onActivityResult:
@SuppressLint("NewApi")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100) {
if (mUploadMessage == null) return;
Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
else if (requestCode == 101) {
if (mUploadMessageArr == null) return;
mUploadMessageArr.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
mUploadMessageArr = null;
}
}
答案 9 :(得分:0)
在MainActivity.java中添加以下代码行
它帮助我启用了js
webSetting.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
不要忘记AndroidManifest文件中的此权限。
<uses-permission Android:name="Android.permission.INTERNET" />
答案 10 :(得分:0)
如果您位于科特林,则可以使用以下方法来使JavaScript正常运行:
webView.apply {
loadUrl(
"file:///android_asset/frm/my_html_landing_page_here.html"
)
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
}
还要确保您的整个文件夹都在Assets文件夹内(其中包括html,javascript和其他所需文件)
干杯。
答案 11 :(得分:0)
如果上述方法均无济于事,请尝试增加WebViewClient.onPageFinished侦听器的延迟时间
override fun onPageFinished(view: WebView?, url: String?) {
Handler().postDelayed({
//update your view with js here
super.onPageFinished(view, url)
}, 1000)
}