我有一个本地html页面以及其他几个资源指向它(css文件和Javascript库),我想加载到一个WebView。这是如何实现的呢?
也许不是最好的方法,但我仍在尝试。
最简单的方法可能是把你的web资源放到资产的文件夹中,然后调用:
webView.loadUrl("file:///android_asset/filename.html");
Java和Webview的完全通信看到这个
更新:资产文件夹通常是以下文件夹: <project>/src/main/assets 这可以在<app>.iml文件中的资产文件夹配置设置中更改为:
<project>/src/main/assets
<app>.iml
<option name=”ASSETS_FOLDER_RELATIVE_PATH” value=”/src/main/assets” />
在这种情况下,使用WebView#loadDataWithBaseUrl()比WebView#loadUrl()更好!
WebView#loadDataWithBaseUrl()
WebView#loadUrl()
webView.loadDataWithBaseURL(url, data, "text/html", "utf-8", null);
url: url/path指向目录的字符串,所有JavaScript文件和html链接都有它们的起源。如果为null,则约为:空白。 data:包含您的hmtl文件的字符串,使用BufferedReader读取,例如
更多信息:WebView.loadDataWithBaseURL (. lang。字符串,. lang。字符串,. lang。字符串,. lang。字符串,以)
也许这个例子可以帮助:
WebView lWebView = (WebView)findViewById(R.id.webView); File lFile = new File(Environment.getExternalStorageDirectory() + "<FOLDER_PATH_TO_FILE>/<FILE_NAME>"); lWebView.loadUrl("file:///" + lFile.getAbsolutePath());
“公认答案”对我没用,对我有用的是这个
WebSettings webSetting = webView.getSettings(); webSetting.setBuiltInZoomControls(true); webView1.setWebViewClient(new WebViewClient()); webView.loadUrl("file:///android_asset/index.html");
XML布局文件:
<WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webView" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".activities.Bani9"> </WebView>
Java代码:
public class Bani9 extends AppCompatActivity { WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bani9); webView = findViewById(R.id.webView); WebSettings webSetting = webView.getSettings(); webSetting.setBuiltInZoomControls(true); webView.setWebViewClient(new WebViewClient()); webView.loadUrl("file:///android_asset/punjabi/bani9.html"); } }
确保您设置的文件路径准确。 < / p >
来自官方指南https://developer.android.com/develop/ui/views/layout/webapps/load-local-content:
app/src/main/assets/
WebViewAssetLoader
onCreate()
final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder() .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this)) .addPathHandler("/res/", new WebViewAssetLoader.ResourcesPathHandler(this)) .build();
WebViewClient
private static class LocalContentWebViewClient extends WebViewClientCompat { private final WebViewAssetLoader mAssetLoader; LocalContentWebViewClient(WebViewAssetLoader assetLoader) { mAssetLoader = assetLoader; } @Override @RequiresApi(21) public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return mAssetLoader.shouldInterceptRequest(request.getUrl()); } @Override @SuppressWarnings("deprecation") // to support API < 21 public WebResourceResponse shouldInterceptRequest(WebView view, String url) { return mAssetLoader.shouldInterceptRequest(Uri.parse(url)); } }
这基本上是将请求URL传递给WebViewAssetLoader以从资产加载web内容。
assetLoader
WebView
index.html
appassets.androidplatform.net
mWebView.setWebViewClient(new LocalContentWebViewClient(assetLoader)); mWebView.loadUrl("https://appassets.androidplatform.net/assets/index.html");
请注意,使用类似web的url而不是file://加载本地文件是可取的,因为它与同源策略兼容。
file://