Включение общего JavaScript в WebViewClient
При поиске ответа в Google кажется, что я не единственный, кто застрял с проблемой, которую, кажется, невозможно решить.
Мне удалось создать WebView с пользовательским WebViewClient - это позволяет мне вести диалог процессов и показывать сообщение об ошибке, если URL не может быть загружен.
Но это создает проблему с JavaScript. URL-адрес, который я загружаю, имеет некоторый JavaScript, который изменяет некоторые CSS-элементы CSS-стилей (показывает или скрывает элемент) или перенаправляет их в другое место при нажатии - или, возможно, даже хочет показать окно предупреждения. Но с помощью WebViewClient ничего из этого не работает.
Вот как я загружаю страницу:
public void loadUrl(String url)
{
final ProgressDialog dialog = ProgressDialog.show(myActivity.this, "", getString(R.string.loading), true);
final WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setVerticalScrollBarEnabled(false);
myWebView.setHorizontalScrollBarEnabled(false);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
Toast.makeText(myActivity.this, url, Toast.LENGTH_SHORT).show(); //Debugging purposes
if (url.endsWith(".mp4"))
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), "video/mp4");
view.getContext().startActivity(intent);
}
else
{
view.loadUrl(url);
}
return true;
}
public void onPageFinished(WebView view, String url)
{
//Toast.makeText(myActivity.this, "Oh no!", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
Toast.makeText(myActivity.this, description, Toast.LENGTH_SHORT).show();
String summary = "<html><body><strong>" + getString(R.string.lost_connection) + "</body></html>";
myWebView.loadData(summary, "text/html", "utf-8");
}
}); //End WebViewClient
myWebView.loadUrl(url);
}
Вероятно, это можно сделать более разумно, но я новичок в разработке как на Java, так и на Android...
Можно ли вообще включить JavaScript для WebViewClient? Удаление WebViewClient решает проблему, но тогда я не могу отловить события, когда страница загружается или заканчивается загрузка.
9 ответов
Я не знаю, в чем именно ваша проблема, но я могу включить JavaScript и пользовательский WebViewclient
без каких-либо проблем:
WebView vistaWeb = (WebView) findViewById(R.id.webview);
vistaWeb.setWebChromeClient(new MyCustomChromeClient(this));
vistaWeb.setWebViewClient(new MyCustomWebViewClient(this));
vistaWeb.clearCache(true);
vistaWeb.clearHistory();
vistaWeb.getSettings().setJavaScriptEnabled(true);
vistaWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
Правильный способ включить JavaScript - добавить две следующие строки:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
Даже если после добавления не работает, попробуйте добавить строку ниже.
mWebView.getSettings().setDomStorageEnabled(true);
Теперь должно работать.:)
Попробуйте это, чтобы включить JavaScript
WebView myWebView = (WebView) findViewById(R.id.webView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient());
myWebView.loadUrl(url);
Этот код работает для меня, надеюсь, он поможет вам и другим разработчикам:
webview = findViewById(R.id.WebView);
webview.setWebViewClient(new WebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.loadUrl("www.example.com");
Что произошло в моем случае: я обслуживал локальные HTML-файлы и при подаче заявления
web.getSettings().setJavaScriptEnabled(true);
web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
но потом мои URL перестали работать. Решение сделать так, чтобы JS и local href работали, было добавить
web.getSettings().setAllowFileAccess(true);
web.getSettings().setAllowFileAccessFromFileURLs(true);
где
web = (WebView) findViewById(R.id.embedded_web);
-> Здравствуйте, попробуйте этот код, этот код работает нормально
-> Для получения дополнительной информации о документации посетите https://developer.android.com/guide/webapps/webview
-> Эта ссылка работает нормально в ноябре 2019 года, в настоящее время я не знаю
-> Ваш XML-код для дизайна
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
-> И ваш Java-код для бэкэнда
package com.developer.harshil.kaneria.webview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.loadUrl("https://github.com/Harshil-Kaneria");
}
}
-> Здесь в коде Java
WebSettings webSettings = myWebView.getSettings();
И это
webSettings.setJavaScriptEnabled(true);
-> Разрешить запуск JavaScript при загрузке страницы
-> Большое спасибо за прочтение.
"Javascript-URLs" проходят через shouldOverrideUrlLoading
? Попробуйте проверить это, и если так, верните false
для таких ссылок (чтобы веб-представление обрабатывало ссылку, а не ваш WebViewClient)
Как включить программно ответил в других ответах. Но некоторые javascripts не работали, если ваш веб-просмотр находится в nestedscrollview. Удалите его и добавьте webSettings.setJavaScriptEnabled(true);
Похоже на ответ @mdelolmo, но в Kotlin:
webview.setWebChromeClient(WebChromeClient())
webview.setWebViewClient(WebViewClient())
webview.clearCache(true)
webview.clearHistory()
webview.getSettings().setJavaScriptEnabled(true)
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true)