При щелчке по URL-адресам открывается браузер по умолчанию
Я загрузил внешний URL в мой WebView
. Теперь мне нужно то, что когда пользователь нажимает на ссылки на загруженной странице, он должен работать как обычный браузер и открывать ссылку в том же WebView
. Но он открывает браузер по умолчанию и загружает страницу там?
Я включил JavaScript. Но все равно это не работает. Я что-то забыл?
Ответы
Ответ 1
Если вы используете 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;
}
}
Ответ 2
в некоторых случаях вам может потребоваться переопределить 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);
}
}
Ответ 3
Официальная документация говорит, щелкните по ссылке в WebView, чтобы запустить приложение, которое обрабатывает URL-адреса. Вам необходимо переопределить это поведение по умолчанию
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
или если в методе нет условной логики, просто сделайте это
myWebView.setWebViewClient(new WebViewClient());
Ответ 4
Добавьте в свой код 2 строки -
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClient());
Ответ 5
Ответ Arulx Z был именно тем, что я искал.
Я пишу приложение с навигационным ящиком с recyclerview и веб-просмотрами для сохранения веб-браузера внутри приложения, независимо от того, нажали ли гиперссылки (таким образом, не запуская внешний веб-браузер). Для этого достаточно поставить следующие 2 строки кода:
mWebView.setWebChromeClient(новый WebChromeClient());
mWebView.setWebViewClient(новый 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)
Ответ 6
Метод 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;
}
});
}