web-dev-qa-db-ja.com

URLをクリックすると、デフォルトのブラウザが開きます

WebViewに外部URLをロードしました。ここで必要なのは、ユーザーが読み込んだページ上のリンクをクリックすると、通常のブラウザーのように動作し、同じWebViewでリンクを開く必要があるということです。しかし、デフォルトのブラウザを開いてそこにページをロードしていますか?

JavaScriptを有効にしました。しかし、まだ機能していません。何か忘れましたか?

203
JaVadid

WebViewを使用している場合、デフォルトのAndroid動作を望まない場合は、自分でクリックをインターセプトする必要があります。

WebView を使用して、WebViewClientのイベントを監視できます。必要なメソッドは shouldOverrideUrlLoading() です。これにより、特定のURLが選択されたときに独自のアクションを実行できます。

setWebViewClient() method を使用して、WebViewClientWebViewを設定します。

SDKの WebViewサンプル を見ると、望みどおりに動作する例があります。次のように簡単です:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
346
Dave Webb

場合によっては、URLロードメソッドをトリガーしないリダイレクトを取得する場合、onLoadResourceのオーバーライドが必要になることがあります。この場合、私は次を試しました:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}
54
realgt

公式 ドキュメント は、WebView内のリンクをクリックすると、URLを処理するアプリケーションを起動します。このデフォルトの動作をオーバーライドする必要があります

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

または、メソッドに条件付きロジックがない場合は、単にこれを行います

myWebView.setWebViewClient(new WebViewClient());
25
abbas

この2行をコードに追加します-

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());
13
Confuse

メソッドboolean shouldOverrideUrlLoading(WebView view, String url)はAPI 24で廃止されました。新しいデバイスをサポートする場合は、boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request)を使用する必要があります。

次のようなことを行うことで、両方を使用できます。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
    });
} else {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
}
8
Chris Stillwell

Arulx Zの答えはまさに私が探していたものでした。

ハイパーリンクのクリックに関係なくアプリ内でWebブラウジングを維持するために、recyclerviewとwebviewsを備えたNavigation Drawerでアプリを作成しています(したがって、外部Webブラウザーは起動しません)。そのためには、次の2行のコードを追加するだけで十分です。

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

webViewステートメントの下に正確に。

実装されたWebViewコードの例を次に示します。

public class WebView1 extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");
}}

これにより、WebサイトでクリックされたすべてのリンクがWebView内にロードされます。 (Android St​​udio 1.2.2を使用してすべてのSDKを更新)

6