2012-03-06 18 views
5

Ho un sito web. Sul sito web, c'è un testo "Pic". Quando visualizzo per la prima volta il sito Web nella Webview, posso modificare il testo in "PicGreat". Funziona!Webview - cambia la sorgente della pagina prima di mostrare il sito web?

Ma, più tardi, quando un utente fa clic su un collegamento (da qualche parte sul sito Web), inoltro l'utente al nuovo sito Web HTML. Prima di mostrare il sito Web, desidero modificare il testo "Pic" in "PicGreat".

Come posso farlo? Devo scrivere una funzione e chiamare la funzione in "booleano pubblico shouldOverrideUrlLoading"?

Ho trovato una domanda simile qui su Stackoverflow, ma non risolta. how to set webview client

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<WebView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/webview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
/> 

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" /> 

WebTest.java

public class WebTestActivity extends Activity { 

WebView mWebView; 
String rline = ""; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

setContentView(R.layout.main); 

mWebView = (WebView) findViewById(R.id.webview); 
mWebView.getSettings().setJavaScriptEnabled(true); 

HttpURLConnection urlConnection = null; 
try 
{ 
URL url = new URL("http://www.picSite.com/"); 
urlConnection = (HttpURLConnection) url.openConnection(); 
InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
BufferedReader rd = new BufferedReader(new InputStreamReader(in), 4096); 
String line; 

while ((line = rd.readLine()) != null) { 
rline += line+"\n"; 
} 
rd.close(); 

} catch (MalformedURLException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
} finally { 
if (null != urlConnection) 
{ 
urlConnection.disconnect(); 
} 
} 

String getNewCode = rline.replace("Pic", "PicGreat"); 

mWebView.loadData(getNewCode, "text/html", "utf-8"); 

mWebView.setWebViewClient(new HelloWebViewClient()); 
} 

private class HelloWebViewClient extends WebViewClient { 
@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
view.loadUrl(url); 
return true; 
} 

} 
} 

risposta

1

userei WebViewClient.shouldInterceptRequest():

Notifica l'applicazione host di una richiesta di risorsa e consente all'applicazione di restituire i dati. Se il valore restituito è nullo, la WebView continuerà a caricare la risorsa come al solito. In caso contrario, verrà utilizzata la risposta di ritorno e i dati.

NOTA: questo metodo viene chiamato su un thread diverso dal thread dell'interfaccia utente, pertanto i client devono prestare attenzione durante l'accesso ai dati privati ​​o al sistema di visualizzazione.

+0

per javadoc di shouldInterceptRequest, indica che restituisce A WebResourceResponse contenente le informazioni di risposta o null se WebView deve caricare la risorsa stessa. Non vedo come si relazionava con la riscrittura dell'html. – kevin

+0

@kevin Puoi caricare la pagina da sola, riscrivere la sua origine e restituirla come "WebResourceResponse'. – user11153