Ответ 1
ИСПРАВЛЕНО! Подстегнутая ошибкой, я обнаружил, что мне нужно установить
setDomStorageEnabled(true)
для настроек веб-просмотра.
Спасибо за вашу помощь Стефан :)
Я пытаюсь сделать версию Android для релятивистского простого приложения iOS, которое использует веб-просмотр, некоторые кнопки, а затем использует javascript-вызовы для CMS.
Но я застрял на довольно ранней стадии разработки: веб-просмотр не работает с javascript. Я прочитал много сообщений о том, как включить JS в веб-просмотр Android, но пока не повезло.
Ниже приведен код моего кода:
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 и в браузере. Но не в моем приложении!
Скажите, пожалуйста, что-то очевидное...
ИСПРАВЛЕНО! Подстегнутая ошибкой, я обнаружил, что мне нужно установить
setDomStorageEnabled(true)
для настроек веб-просмотра.
Спасибо за вашу помощь Стефан :)
Если что-то с WebView на Android не работает, я всегда стараюсь, чтобы установить эти сумасшедшие флаги, например
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 в настоящее время, и что использование с включенным javascript, когда DOM недоступен, если не указано. Надеюсь, кто-то подал это как ошибку или улучшение/функцию-запрос уже, и обезьяны работают над ним.
а затем где-то есть гниение, например:
webView.getSettings().setPluginState(PluginState.ON);
Все это для загрузки веб-страниц внутри приложения.
В 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)
}
Загрузка javascript в webview
webView.getSettings().setDomStorageEnabled(true);
Вы включили правильное интернет-разрешение в манифесте? В противном случае все выглядит хорошо. Случайно, вы также тестировали этот код на реальном телефоне Android? И не только на эмуляторе?
Вот хороший учебник о немного другом подходе. Вы можете попробовать это, чтобы увидеть, работает ли он для вас.
Это видео (http://youtu.be/uVqp1zcMfbE) дало мне подсказку, чтобы заставить его работать.
Ключ должен сохранить ваши файлы html
и js
в папке Android assets/
.
Затем вы можете легко получить к ним доступ через:
webView.loadUrl("file:///android_assets/your_page.html");
Добавьте следующие строки кода в свой файл MainActivity.java
Это помогло мне включить JS
webSetting.setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
не забудьте об этом разрешении в файле AndroidManifest.
<uses-permission Android:name="Android.permission.INTERNET" />
Просто разрешите вашему WebView запускать JS, просто так:
WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);
Чтобы включить всплывающие окна javascript в WebView, необходимо установить 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;
}
}
Если вы находитесь в Kotlin, вы можете использовать эти методы, чтобы заставить JavaScript работать:
webView.apply {
loadUrl(
"file:///android_asset/frm/my_html_landing_page_here.html"
)
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
}
Также убедитесь, что вся ваша папка находится в папке Assets (включая html, javascript и другие необходимые файлы)
Приветствия.
Если ничего из вышеперечисленного не помогло, попробуйте добавить задержку в слушателе WebViewClient.onPageFinished.
override fun onPageFinished(view: WebView?, url: String?) {
Handler().postDelayed({
//update your view with js here
super.onPageFinished(view, url)
}, 1000)
}