Включение общего 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)
Другие вопросы по тегам