グーグルで答えを探している間、解決することが不可能と思われる問題を抱えているのは私だけではないようです。
カスタムWebViewClientを使用してWebViewを作成することができました。これにより、プロセスダイアログを使用して、URLをロードできなかった場合にエラーメッセージを表示することができます。
しかし、これによりJavaScriptに問題が生じます。読み込んでいるURLには、HTML要素のCSSスタイル(要素の表示または非表示)を変更したり、onclickで別の場所にリダイレクトしたり、警告ボックスを表示したりする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);
JavaScriptを有効にする適切な方法は、以下の2行を追加することです。
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);
「Javascript-URLs」はshouldOverrideUrlLoading
を介してルーティングされますか?それを確認してみてください。そうであれば、そのようなリンクに対してfalse
を返します(WebViewがWebViewClientではなくリンクを処理するように)
私のケースで何が起こったのか:ローカルhtmlファイルを提供していて、
web.getSettings().setJavaScriptEnabled(true);
web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
しかし、その後、私のURLは動作しなくなりました。 JSとローカルhrefの両方を機能させるソリューションは、追加することでした
web.getSettings().setAllowFileAccess(true);
web.getSettings().setAllowFileAccessFromFileURLs(true);
どこで
web = (WebView) findViewById(R.id.embedded_web);
@mdelolmo answerと似ていますが、Kotlinで:
webview.setWebChromeClient(WebChromeClient())
webview.setWebViewClient(WebViewClient())
webview.clearCache(true)
webview.clearHistory()
webview.getSettings().setJavaScriptEnabled(true)
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true)