2015-04-23 2 views
1

Я работаю с Android 5.0 и последним обновлением компонента WebView. Я пытаюсь внедрить удаленный веб-сайт (я не могу изменить исходный код этого сайта) в WebView.Android предотвращает навигацию WebView

Мой код ниже

webView.setWebViewClient(new WebViewClient() { 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if(url.contains(URL_SERVLET)) { 
      //Do nothing 
      Log.d("DEBUG", "load IMAGE"); 
      //view.stopLoading(); 
     } else { 
      Log.d("DEBUG", "load URL into WebView"); 
      view.loadUrl(url); 
     } 
     return true; 
    } 
    // Called when all page resources loaded 
    public void onPageFinished(WebView view, String url) { 
     webView.setVisibility(View.VISIBLE); 
     splashscreenLayout.setVisibility(View.GONE); 
    } 
}); 

На стороне сайта, я получаю кнопку, которая откроет другую страницу (с помощью JavaScript) внутри всплывающего окна. Когда я нажимаю на нее через веб-представление Android, этот новый URL-адрес заменяет текущий в веб-просмотре. Я просто хочу, чтобы ничего не произошло, когда я нажимаю на эту кнопку.

Он работает с этим кодом: этот адрес не загружен. Но веб-просмотр становится белым, как пустой экран.

Я попытался вызвать stopLoading(), не делает трюк.

Я не могу позвонить webview.reload(), потому что удаленный веб-сайт написан в jsp с одним URL-адресом, который обеспечивает (генерирует на лету, я думаю) html-страницу. Если я вызываю reload(), WebView повторно инициализирует первую страницу (страницу входа).

Я также попытался сохранить состояние веб-просмотра и восстановить его, но он не работает.

Есть ли способ «заблокировать» изменение URL-адреса и сохранить веб-просмотр, указывающий на первый URL-адрес без перезагрузки?

ответ

0

Существует несколько хакерских способ сделать это, что должно было бы написать javascript, который предотвращает навигацию по страницам и вводит их в ваш WebView.

Javascript будет выглядеть ответ отправил here

var location = window.document.location; 

var preventNavigation = function() { 
    var originalHashValue = location.hash; 

    window.setTimeout(function() { 
     location.hash = 'preventNavigation' + ~~ (9999 * Math.random()); 
     location.hash = originalHashValue; 
    }, 0); 
}; 

window.addEventListener('beforeunload', preventNavigation, false); 
window.addEventListener('unload', preventNavigation, false); 

Примечания: Альтернативы и менее навязчивый способ сделать это может быть ваш Javascript просто отключить определенную кнопку в вопросе.

Затем, чтобы придать это в вашем WebView, вы можете последовать примеру отправил here

WebView myWebView = (WebView) findViewById(R.id.webView); 
WebSettings webSettings = myWebView.getSettings(); 

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

    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     injectScriptFile(view, "js/script.js"); // see below ... 

     // test if the script was loaded 
     view.loadUrl("javascript:setTimeout(test(), 500)"); 
    } 

    private void injectScriptFile(WevView view, String scriptFile) { 
     InputStream input; 
     try { 
     input = getAssets().open(scriptFile); 
     byte[] buffer = new byte[input.available()]; 
     input.read(buffer); 
     input.close(); 

     // String-ify the script byte-array using BASE64 encoding !!! 
     String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP); 
     view.loadUrl("javascript:(function() {" + 
         "var parent = document.getElementsByTagName('head').item(0);" + 
         "var script = document.createElement('script');" + 
         "script.type = 'text/javascript';" + 
     // Tell the browser to BASE64-decode the string into your script !!! 
         "script.innerHTML = window.atob('" + encoded + "');" + 
         "parent.appendChild(script)" + 
         "})()"); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
    } 
}); 

myWebView.loadUrl("http://www.example.com"); 
Смежные вопросы