Клацання URL-адрес відкриває браузер за замовчуванням


209

Я завантажив зовнішню URL-адресу в свою WebView. Тепер мені потрібно те, що коли користувач натискає на посилання на завантаженій сторінці, він повинен працювати як звичайний браузер і відкривати посилання в тому ж самому WebView. Але це відкриття браузера за замовчуванням і завантаження сторінки туди?

Увімкнено JavaScript. Але все одно це не працює. Я щось забув?

Відповіді:


353

Якщо ви користуєтесь, WebViewвам доведеться перехоплювати кліки самостійно, якщо ви не хочете поведінки Android за замовчуванням.

Ви можете відстежувати події в режимі " WebViewa" WebViewClient. Запропонований вам метод shouldOverrideUrlLoading(). Це дозволяє виконувати власну дію, коли обрана певна URL-адреса.

Ви встановлюєте WebViewClientсвій методWebView за допомогою setWebViewClient()методу .

Якщо ви подивитеся на WebViewзразок у SDK , є приклад, який робить саме те, що ви хочете. Це так просто, як:

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

97
Схоже, це поведінка за замовчуванням WebViewClientі не потрібно підкласифікувати, якщо це все, що ви робите. Я змусив це працювати лише тим, що робивmyWebView.setWebViewClient(new WebViewClient());
Адам

7
@ dave-webb, будь ласка, оновіть зразок, щоб не викликати loadUrl. Усі, хто читає це - будь ласка, не копіюйте код (поверніть помилкове з зворотного дзвінка замість виклику view.loadUrl). Виклик loadUrl вводить тонку помилку, якщо, якщо у вас є який-небудь кадр на сторінці зі URL-адресою спеціальної схеми (скажімо, <iframe src = "tel: 123" />), він переміститься в основний кадр вашого додатка до цієї URL-адреси, що, швидше за все, порушує програму як побічний ефект.
marcin.kosiba

1
@Adam ++ - так, я теж це помітив - я не міг зрозуміти, чому один із моїх веб-переглядів НЕ використовує системний браузер, і це було тому, що я додав до нього новий веб-кліент, який був лише переважаючим НАДІЙНИЙ метод. Це зайняло мені час, щоб налагодити.
Пітер Айтай

Чи можемо ми реалізувати щось на кшталт: onLongClick, відкриті посилання у зовнішньому браузері?
TheOnlyAnil

54

у деяких випадках може знадобитися переопрацювання onLoadResource, якщо ви отримаєте переспрямування, яке не запускає метод завантаження URL-адреси. у цьому випадку я спробував таке:

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

Це чудово! Заощадило мені багато годин спроб розробити, як відтворити MP3-файл із посилання на веб-перегляді. Дякую багато realgt!
Brigante

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 була саме тим, що я шукав.

Я пишу програму з навігаційним ящиком з переглядом та переглядом веб-сторінок, щоб не переглядати веб-сайт у додатку незалежно від натиснутої гіперпосилання (таким чином, не запускаючи зовнішній веб-браузер). Для цього буде достатньо поставити наступні 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");
}}

Таким чином, кожне посилання, натиснуте на веб-сайті, завантажиться всередині вашого веб-перегляду. (Використання Android Studio 1.2.2 з усіма оновленими пакетами SDK)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.