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


209

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

JavaScriptを有効にしました。しかし、それでも機能しません。何かを忘れましたか?

回答:


353

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

あなたは内のイベントを監視することができますWebView使用してAをWebViewClient。あなたが望む方法はですshouldOverrideUrlLoading()。これにより、特定のURLが選択されたときに独自のアクションを実行できます。

メソッドを使用しWebViewClientWebViewを設定します。setWebViewClient()

WebViewSDKサンプルを見ると、必要な処理を実行する例があります。それは次のように簡単です:

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

97
これはのデフォルトの動作でWebViewClientあり、これで十分であればサブクラス化は不要です。私はこれを実行するだけで機能しましたmyWebView.setWebViewClient(new WebViewClient());
Adam

7
@ dave-webbサンプルを更新して、loadUrlを呼び出さないようにしてください。誰もがこれを読んでいます-コードを複製しないでください(view.loadUrlを呼び出す代わりにコールバックからfalseを返します)。loadUrlを呼び出すと、カスタムスキームURL(たとえば、<iframe src = "tel:123" />)を含むページ内にiframeがある場合に、アプリのメインフレームがそのURLに移動して、アプリが副作用。
marcin.kosiba 2014

1
@Adam ++-はい、私もこれに気付きました-私のWebビューの1つがシステムブラウザを使用していない理由を理解できませんでした。それは、別のメソッドをオーバーライドするだけの新しいWebクライアントを追加したためです。デバッグに時間がかかりました。
Peter Ajtai 2014

onLongClick、外部ブラウザでリンクを開くなどの実装は可能ですか?
TheOnlyAnil 2015

54

場合によっては、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);
    }           
}

これは素晴らしい!WebviewのリンクからMP3ファイルを再生する方法を試すのに費やす時間を節約できました。本当にありがとう!
ブリガンテ2011

25

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

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

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

myWebView.setWebViewClient(new WebViewClient());

15

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

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

9

このメソッド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;
        }
    });
}

6

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

ハイパーリンクがクリックされた(したがって外部のWebブラウザーが起動されない)とは関係なく、アプリ内でWebの閲覧を維持するために、recyclerviewとwebviewsを備えたナビゲーションドロワーを使用してアプリを作成しています。そのためには、次の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内に読み込まれます。(すべてのSDKが更新されたAndroid Studio 1.2.2を使用)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.