1. ホーム
  2. android

WebViewClient で一般的な JavaScript を有効にする

2023-08-30 18:29:19

質問

Google で答えを探しているとき、解決不可能と思われる問題で困っているのは私だけではなさそうです。

私は、カスタムの WebViewClient で WebView を作成することができました。これは、processdialog を持ち、URLを読み込めなかった場合にエラーメッセージを表示することを可能にします。

しかし、これはJavaScriptで問題を起こします。私が読み込んでいる URL には、HTML 要素の CSS スタイルを変更したり (要素の表示または非表示)、クリック時に別の場所にリダイレクトしたり、あるいはアラート ボックスを表示したりする JavaScript が含まれています。しかし、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の開発も初めてなので...。

WebViewClientのJavaScriptを全く有効にすることはできないのでしょうか? WebViewClientを削除すると問題は解決しますが、その場合、ページのエラーや読み込みが終了したときのイベントをキャッチすることができません。

どのように解決するのですか?

私はあなたの正確な問題が何であるかわからないが、私は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);