При нажатии на URL открывается браузер по умолчанию


209

Я загрузил внешний URL в мой WebView. Теперь мне нужно то, что когда пользователь нажимает на ссылки на загруженной странице, он должен работать как обычный браузер и открывать ссылку там же WebView. Но он открывает браузер по умолчанию и загружает страницу там?

Я включил JavaScript. Но все равно это не работает. Я что-то забыл?

Ответы:


353

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

Вы можете отслеживать события в WebViewиспользовании 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. Все, кто читает это - пожалуйста, не повторяйте код (возвращайте false из обратного вызова вместо вызова view.loadUrl). Вызов loadUrl представляет собой небольшую ошибку, когда, если у вас есть какой-либо iframe на странице с 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 по ссылке в веб-просмотре. Большое спасибо!
Бриганте

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 был именно тем, что я искал.

Я пишу приложение с помощью Navigation Drawer с 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");
}}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.