我需要知道shouldinterceptrequest
是如何工作的。我不知道如何創建和處理這種方法來讀取和替換CSS鏈接。謝謝!webview shouldinterceptrequest example
22
A
回答
57
那麼,簡短的回答是,它的工作原理與shouldOverrideUrlLoading(WebView view, String url)
非常相似,如WebView tutorial所示。
爲了幫助您入門,請參閱下面的代碼。您只需覆蓋WebViewClient的shouldInterceptRequest(WebView view, String url)
方法。顯然,你沒有做內聯,但緊湊的緣故,這就是我所做的:
WebView webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest (final WebView view, String url) {
if (url.contains(".css")) {
return getCssWebResourceResponseFromAsset();
} else {
return super.shouldInterceptRequest(view, url);
}
}
/**
* Return WebResourceResponse with CSS markup from a String.
*/
@SuppressWarnings("deprecation")
private WebResourceResponse getCssWebResourceResponseFromString() {
return getUtf8EncodedCssWebResourceResponse(new StringBufferInputStream("body { background-color: #F781F3; }"));
}
/**
* Return WebResourceResponse with CSS markup from an asset (e.g. "assets/style.css").
*/
private WebResourceResponse getCssWebResourceResponseFromAsset() {
try {
return getUtf8EncodedCssWebResourceResponse(getAssets().open("style.css"));
} catch (IOException e) {
return null;
}
}
/**
* Return WebResourceResponse with CSS markup from a raw resource (e.g. "raw/style.css").
*/
private WebResourceResponse getCssWebResourceResponseFromRawResource() {
return getUtf8EncodedCssWebResourceResponse(getResources().openRawResource(R.raw.style));
}
private WebResourceResponse getUtf8EncodedCssWebResourceResponse(InputStream data) {
return new WebResourceResponse("text/css", "UTF-8", data);
}
});
webview.loadUrl("http://stackoverflow.com");
趕上CSS文件的加載和返回自己WebResourceResponse
包含要加載代替數據。
請注意,此方法需要API級別11。
如果你想爲Android 2.x做類似的事情,你可能想嘗試使用前面提到的shouldOverrideUrlLoading(WebView view, String url)
來避免加載頁面,手動獲取它,用你自己的替換引用到css文件,最後請在WebView上調用loadData(String data, String mimeType, String encoding)
(或loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
),並以字符串形式傳遞操作的html內容。
前:
後:
1
,這可能是也爲你有意思。它從特定文件夾中讀取文件,如果請求以該文件名傳入,它將使用資產文件夾中的文件,而不是來自Web的文件。
//get list of files of specific asset folder
private ArrayList listAssetFiles(String path) {
List myArrayList = new ArrayList();
String [] list;
try {
list = getAssets().list(path);
for(String f1 : list){
myArrayList.add(f1);
}
} catch (IOException e) {
e.printStackTrace();
}
return (ArrayList) myArrayList;
}
//get mime type by url
public String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {
if (extension.equals("js")) {
return "text/javascript";
}
else if (extension.equals("woff")) {
return "application/font-woff";
}
else if (extension.equals("woff2")) {
return "application/font-woff2";
}
else if (extension.equals("ttf")) {
return "application/x-font-ttf";
}
else if (extension.equals("eot")) {
return "application/vnd.ms-fontobject";
}
else if (extension.equals("svg")) {
return "image/svg+xml";
}
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;
}
//return webresourceresponse
public WebResourceResponse loadFilesFromAssetFolder (String folder, String url) {
List myArrayList = listAssetFiles(folder);
for (Object str : myArrayList) {
if (url.contains((CharSequence) str)) {
try {
Log.i(TAG2, "File:" + str);
Log.i(TAG2, "MIME:" + getMimeType(url));
return new WebResourceResponse(getMimeType(url), "UTF-8", getAssets().open(String.valueOf(folder+"/" + str)));
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
//@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@SuppressLint("NewApi")
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
//Log.i(TAG2, "SHOULD OVERRIDE INIT");
//String url = webResourceRequest.getUrl().toString();
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
//I have some folders for files with the same extension
if (extension.equals("css") || extension.equals("js") || extension.equals("img")) {
return loadFilesFromAssetFolder(extension, url);
}
//more possible extensions for font folder
if (extension.equals("woff") || extension.equals("woff2") || extension.equals("ttf") || extension.equals("svg") || extension.equals("eot")) {
return loadFilesFromAssetFolder("font", url);
}
return null;
}
相關問題
- 1. 安卓的WebView shouldInterceptRequest在WebView中不添加RequestProperties
- 2. Android中的shouldInterceptRequest中的webview中獲取響應標頭
- 3. 從webview中的自定義HTML Ajax調用沒有capIn with shouldInterceptRequest
- 4. 音頻不能在Android WebView中使用shouldInterceptRequest()
- 5. 在android webview中阻止視頻 - shouldInterceptRequest()的替代方法
- 6. shouldoverrideurlloading和shouldinterceptrequest之間的區別?
- 7. 通過ShouldInterceptRequest發送JSON對象
- 8. ajax aspx example
- 9. Ada hello world example
- 10. Google AppEngine Session Example
- 11. sIFR onReplacement example
- 12. rss feed android example
- 13. Bootstrap bs-example
- 14. Apache http post example
- 15. Tensorflow-example with flowers
- 16. Haskell Snap:Session example
- 17. Java - removeIf example
- 18. asp.net mvc session example
- 19. NOSQLUnit-mongoDB-example
- 20. wordpress get_categories example
- 21. twisted.web.resource.Resource with twisted.web.template.Element example
- 22. ZXing objective c example
- 23. asp.net mvc example db
- 24. NSIndexSet indexPassingTest example
- 25. Javascript Promise/Then Example
- 26. Bellman-Ford Visual Example
- 27. Struts hello world example
- 28. 無法覆蓋shouldInterceptRequest(),使我自己的HTTP請求
- 29. 覆蓋Android上的函數shouldInterceptRequest
- 30. WebViewClient shouldInterceptRequest處理gzip壓縮的數據
那麼我該如何將我的aspx文件中的css鏈接替換爲本地文件並放入返回webresourceresponse中。 – androdio
好吧,你實際上並沒有替換aspx文件中的css鏈接,但是每當加載引用的css文件時,你都會攔截它並取而代之返回你自己的css內容。我用一個例子擴展了我的答案中的代碼。我沒有真的嘗試過,但看看它應該有點像這樣的文檔。請注意,代替使用帶css標記的字符串,您也可以從SD卡或資源加載文件,並將其作爲InputStream傳遞。 –
我試過這樣從本地文件中讀取css: InputStream im = null; File file = new File(「file:///android_asset/android.css」); \t \t \t嘗試{ \t \t \t \t IM =新的FileInputStream(文件); \t \t \t} catch(FileNotFoundException e){} 不幸的是,它不會加載文件的數據。非常感謝你的幫助! – androdio