shouldinterceptrequest
の仕組みを知る必要があります。私はこのメソッドを作成して、CSSリンクを読み込んで置き換える方法を知りません。ありがとうございました!webview shouldinterceptrequestの例
答えて
これは、WebView tutorialに示すように、shouldOverrideUrlLoading(WebView view, String url)
と非常によく似ています。
開始するには、以下のコードをご覧ください。 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コンテンツを文字列として渡します。これはあなたのためにも面白いかもしれません
:後
:前
。特定のフォルダからファイルを読み込み、このファイル名でリクエストが受信された場合は、アセットフォルダのファイルを使用し、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. shouldInterceptRequest for Android Froyo(2.2)
- 2. wxPython WebViewの例
- 3. 関数のオーバーライドshouldInterceptRequest on Android
- 4. API21のshouldInterceptRequestパラメータの変更方法
- 5. javaのfxのwebviewのJSの例外?
- 6. Android WebViewプロトコルハンドラ
- 7. 複数のWebViewを使用したAndroid ViewFlipperの例を確認
- 8. Android Webview/textviewの組み合わせXMLの例
- 9. 別のWebviewへのWebviewリクエストのスロー
- 10. WebViewの
- 11. WebViewの
- 12. webview + gallery + webviewを表示
- 13. AndroidスタジオWebviewのGoogle PlayでWebviewオープンリンク
- 14. android webviewカスタムヘッダーがページリソース要求に出てこない
- 15. AndroidのWebViewの
- 16. WebView OutOfMemoryException
- 17. Android webViewのJavascript
- 18. アンドロイドのWebView
- 19. WebViewのJavaアプレット
- 20. Android WebViewのスムーススクロール
- 21. のWebViewとCustomFont
- 22. Android webviewのプログレスバー
- 23. IonicアプリケーションのWebview
- 24. Android WebViewのスクロールダウン
- 25. のWebViewとステータスバー
- 26. Android WebViewの幅
- 27. WebViewのページ数
- 28. アンドロイド - WebViewの
- 29. Qt5.6のクロスプラットフォームWebview
- 30. のWebView/AlertView
私はaspxファイル内のCSSリンクをローカルのものに置き換え、webresourceresponseを返します。 – androdio
さて、あなたは実際にaspxファイルのcssリンクを置き換えませんが、参照されるcssファイルが読み込まれるたびに、それを傍受して代わりに独自のcssコンテンツを返します。私は答えを例としてコードを拡張しました。私は実際にそれを試したことはありませんが、ドキュメンテーションを見ればそれはいくらか似ているはずです。 CSSマークアップで文字列を使用する代わりに、SDカードやリソースからファイルを読み込んで、それをInputStreamとして渡すこともできます。 –
ローカルファイルからCSSを読み取ろうとしました。 InputStream im = null; ファイルfile =新しいファイル( "file:///android_asset/android.css"); \t \t \t試み{ \t \t \t \t IM =新しいFileInputStreamを(ファイル)。 \t \t \t} catch(FileNotFoundException e){} 残念ながら、ファイルのデータはロードされません。手伝ってくれてどうもありがとう! – androdio