对于我的一个项目,我试图在webview中显示我从互联网上获取的页面,但在我这样做之前改变它。对于从该webview点击的所有网址,我也是这样做的。
为了做到这一点,我首先创建了一个扩展WebView的类,并添加了一个方法loadAlteredUrl(String url)
public void loadAlteredUrl(String url) {
String page = getURLContent(url);
String filtered;
// Code for altering the webpage
super.loadData(filtered, "text/html", "UTF-8");
//super.loadUrl("data:text/html;UTF-8," + filtered);
}
private String getURLContent(String url)
{
try{
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = httpClient.execute(httpGet, localContext);
String result = "";
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent()
)
);
String line = null;
while ((line = reader.readLine()) != null){
result += line + "\n";
}
return result;
} catch (IOException ex) {
return "IOEXCEPTION";
}
此代码已经过测试且效果很好。但现在我只能改变我的第一页加载,这不是我想要的。所以我扩展了WebViewClient类并重载了shouldOverloadUrl函数:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
EnhancedWebview myview = (EnhancedWebview) view;
if(!url.contains("http://")){
if(url.substring(0, 1).equals("/"))
url = url.substring(1);
myview.loadAlteredUrl(MainWindow.baseUrl + url);
return true;
}
return false;
}
但是,这很奇怪,这段代码只能工作一半的时间。当我调试这个代码时,它总是经历相同的步骤,但是出于一些奇怪的原因,它只会打开url's,如果我实际上双击它或更多。我感觉双击(甚至垃圾邮件点击时)“打破”内部工作的某些东西,使其正常工作,因为当我使用它时应该使用它,它会经历所有必要的步骤,但不会加载页面(即使使用我的自定义方法等提取页面)。
任何人都知道我在这里失踪了什么?
答案 0 :(得分:1)
问题是'uncomplete'链接没有调用shouldOverrrideUrlLoading()。这是出于安全原因。通常,您可以通过强制链接“完成”来解决此问题:
// browser.loadData(page, "text/html", "UTF-8");
browser.loadDataWithBaseURL("base_url", page, "text/html", "UTF-8", null);
loadDataWithBaseURL将基本网址添加到所有未完成的链接。