Подтвердить что ты не робот

WebChromeClient открывает ссылку в браузере

Я искал и читал много сообщений, но не могу понять, как это сделать в моем коде.

Я хочу использовать геолокацию в своем приложении и вам нужно просмотреть в webChromeClient вместо webViewClient, который я сейчас использую для html файлов, и ссылки остаются в одном представлении.

Когда я меняю это на webChromeClient, html-ссылки, например <a href="#" onclick="location.href='http://url/file.php?q=123'; return false;", неожиданно открываются в браузере!

Как я могу предотвратить это?

myWebView = new WebView(this);  
myWebView.getSettings().setJavaScriptEnabled(true);   
myWebView.getSettings().setLoadWithOverviewMode(true);
myWebView.getSettings().setUseWideViewPort(true);
myWebView.getSettings().setGeolocationEnabled(true);
myWebView.setWebChromeClient(new WebChromeClient() {
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) { 
        callback.invoke(origin, true, false); }
});
myWebView.loadUrl("file:///android_asset/HTML/index.html");
setContentView(myWebView);
4b9b3361

Ответ 1

WebChromeClient не содержит метод shouldOverrideUrlLoading, который делает WebViewClient. Помните, что "WebView" может и одновременно использовать оба WebViewClient и WebChromeClient, если они указаны. WebViewClient добавляет методы, недоступные для вас без назначенного клиента (ведение навигации в веб-просмотре). То же самое с WebChromeClient имеет определенные методы, которые он может использовать (например, получить заголовок страницы при загрузке).

Итак, вы можете создать свой код следующим образом:

WebView web = (WebView)findViewById(R.id.web);
WebSettings webSettings = web.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setGeolocationEnabled(true);
webSettings.setSupportMultipleWindows(true); // This forces ChromeClient enabled.    

web.setWebChromeClient(new WebChromeClient(){
    @Override
    public void onReceivedTitle(WebView view, String title) {
         getWindow().setTitle(title); //Set Activity tile to page title.
    }
});

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

Ответ 2

Мне удалось обойти это, установив фиктивный WebViewClient в дополнение к WebChromeClient. Не знаю, почему, но когда я вынимаю эту строку, веб-страница снова открывается в браузере.

mBrowser.setWebViewClient(new WebViewClient());

Ответ 3

Чтобы открыть ссылки в браузере, вы можете использовать intent в методе shouldOverrideUrlLoading для запуска URL-адреса в браузере, а используя webview для обработки ссылки:

webView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && url.startsWith("http://")) {
            view.getContext().startActivity(
                new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        } else {
            return false;
        }
    }
}

Если вы хотите загрузить в webview, используйте:

WebViewClient yourWebClient = new WebViewClient()
{
   // Override page so it load on my view only
   @Override
   public boolean shouldOverrideUrlLoading(WebView  view, String  url)
   {
         // This line we let me load only pages with an anchor tag
         if ( url.contains("url") == true )
           //Load new URL Don't override URL Link
        return false;

   // Return true to override url loading (In this case do nothing).
   return true;
    }
};