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

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

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


person JaVadid    schedule 04.03.2010    source источник


Ответы (6)


Если вы используете 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;
    }
}
person Dave Webb    schedule 04.03.2010
comment
Похоже, что это поведение по умолчанию для WebViewClient и не требует подкласса, если это все, что вы делаете. Я заставил это работать, просто выполнив myWebView.setWebViewClient(new WebViewClient()); - person Adam; 08.10.2012
comment
@ dave-webb обновите образец, чтобы не вызывать loadUrl. Все, кто это читает - пожалуйста, не копируйте код (верните false из обратного вызова вместо вызова view.loadUrl). Вызов loadUrl вводит тонкую ошибку, когда, если у вас есть какой-либо iframe на странице с URL-адресом настраиваемой схемы (скажем, ‹iframe src = tel: 123 /›), он будет перемещать основной фрейм вашего приложения на этот URL-адрес, скорее всего, сломает приложение как сторону эффект. - person marcin.kosiba; 07.02.2014
comment
@Adam ++ - да, я тоже это заметил - я не мог понять, почему одно из моих веб-представлений НЕ использовало системный браузер, и это было потому, что я добавил к нему новый веб-клиент, который только переопределял ДРУГОЙ метод. На отладку у меня ушло время. - person Peter Ajtai; 15.02.2014
comment
Можем ли мы реализовать что-то вроде: onLongClick, открывать ссылки во внешнем браузере? - person TheOnlyAnil; 16.04.2015

в некоторых случаях вам может потребоваться переопределение 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);
    }           
}
person realgt    schedule 22.04.2010
comment
Отлично! Сэкономил мне много часов, пытаясь понять, как воспроизвести файл MP3 по ссылке в веб-просмотре. Большое спасибо! - person Brigante; 23.08.2011

Официальная документация гласит, что щелчок по ссылке в WebView запускает приложение, которое обрабатывает URL-адреса. Вам необходимо переопределить это поведение по умолчанию

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

или если в методе нет условной логики, просто сделайте это

myWebView.setWebViewClient(new WebViewClient());
person abbas    schedule 20.09.2013

Добавьте эти 2 строки в свой код -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());
person Confuse    schedule 03.10.2014

Метод 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;
        }
    });
}
person Chris Stillwell    schedule 22.06.2016

Ответ Arulx Z был именно тем, что я искал.

Я пишу приложение с навигационным ящиком с 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)

person Samuele Bolognini    schedule 15.06.2015
comment
Это самый простой способ сделать это. Спасибо Сэм - person Redgren Grumbholdt; 14.11.2020