AndroidにwebViewがあり、その中にhtml Webページを開きます。しかし、それはリンクと画像でいっぱいであり、それらのいずれかをクリックすると、私のウェブビューにロードされます。この動作を無効にしたいので、リンクをクリックしてもロードしないでください。私はこれを試してみました solution と自分のために少し編集しましたが、うまくいきませんでした。私のwebviewclientコード:
private boolean loaded = false;
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(loaded == false){
view.loadUrl(url);
loaded = true;
return true;
}else{
return false;
}
}
私のウェブビューの実装と設定。
WebView wv = (WebView) findViewById(R.id.recipeWv);
ourWebViewClient webViewClient = new ourWebViewClient();
webViewClient.shouldOverrideUrlLoading(wv, URLsave);
wv.setWebViewClient(webViewClient);
wv.setFocusableInTouchMode(false);
wv.setFocusable(false);
wv.setClickable(false);
WebSettings settings = wv.getSettings();
settings.setDefaultTextEncodingName("utf-8");
settings.setLoadWithOverviewMode(true);
settings.setBuiltInZoomControls(true);
例:ユーザーが私のWebビューでStackOverflowホームページを開き、リンク(「質問」など)のいずれかをクリックすると、WebビューはStackOverflowホームページにとどまるはずです。
現在のURLをクラス変数に保存し、ロードされたURLと同じかどうかを確認する必要があります。ユーザーがリンクをクリックすると、shouldOverrideUrlLoading
が呼び出され、Webサイトを確認します。このようなもの:
private String currentUrl;
public ourWebViewClient(String currentUrl) {
this.currentUrl = currentUrl;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals(currentUrl)) {
view.loadUrl(url);
}
return true;
}
重要:WebViewClient
をWebView
に設定することを忘れないでください。
ourWebViewClient webViewClient = new ourWebViewClient(urlToLoad);
wv.setWebViewClient(webViewClient);
WebViewClientを実装し、WebView Clientのこのメソッドからtrueを返すだけです
webView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
});
Webページの内部リンクを別のウィンドウで開く場合
使用しない
WebView webView;//Your WebView Object
webView.setWebViewClient(new HelpClient());// Comment this line
B'coz setWebViewClient()メソッドは、同じWebビューで新しいページを開く処理を行っています。この行を簡単にコメントしてください。
private class HelpClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("www.example.com")) {
// This is my web site, so do not override; let my WebView load the page
return false;
}
// Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
}
これがうまくいくことを願っています。
私も同じ問題に直面していました。以下のようにこの問題を解決しました
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
ラムダ式を使用
webView.setOnTouchListener((v, event) -> true);
次のようなコードを追加する必要があります。
webview.loadUrl(url);
webview.setWebViewClient(new MyWebViewClient());
そして、このような追加のクラスMyWebViewClientを追加します-
/* Class for webview client */
class MyWebViewClient extends WebViewClient {
// show the web page in webview but not in web browser
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
}
}
アミット・グプタの答えと非常に似ていますが、私はそれを行うより短い方法を見つけました。
private String currentUrl;
public CustomWebViewClient(String currentUrl) {
this.currentUrl = currentUrl;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return ! url.equals(currentUrl);
}
このCustomWebViewClientを定義したら、クライアントをWebビューに設定します。
CustomWebViewClient webViewClient = new CustomWebViewClient(urlToLoad);
wv.setWebViewClient(webViewClient);