Загрузить файл HTML в WebView
У меня есть локальная html-страница наряду с несколькими другими указанными на ней ресурсами (css-файлы и библиотеки Javascript), которые я хотел бы загрузить в WebView . Как этого достичь?
Возможно, не лучший способ продолжить, но я все еще экспериментирую.
6 ответов
Возможно, самым простым способом было бы поместить ваши веб-ресурсы в папку активов и затем вызвать:
webView.loadUrl("file:///android_asset/filename.html");
Для полной связи между Java и Webview см. Это
Обновление: папка ресурсов обычно является следующей папкой: <project>/src/main/assets
Это можно изменить в настройках конфигурации папки ресурса в вашем <app>.iml
файл как:
<option name=”ASSETS_FOLDER_RELATIVE_PATH” value=”/src/main/assets” />
Смотрите статью Где разместить папку активов в Android Studio
Вероятно, этот образец может помочь:
WebView lWebView = (WebView)findViewById(R.id.webView);
File lFile = new File(Environment.getExternalStorageDirectory() + "<FOLDER_PATH_TO_FILE>/<FILE_NAME>");
lWebView.loadUrl("file:///" + lFile.getAbsolutePath());
В этом случае, используя WebView#loadDataWithBaseUrl()
лучше, чем WebView#loadUrl()
!
webView.loadDataWithBaseURL(url,
data,
"text/html",
"utf-8",
null);
url: url / path Строка, указывающая на каталог, все ваши файлы JavaScript и ссылки html имеют свое происхождение. Если ноль, это о: пусто. data: строка, содержащая ваш файл hmtl, например, с помощью BufferedReader
Дополнительная информация: WebView.loadDataWithBaseURL (java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
Принятый ответ не работает для меня, это то, что работает для меня
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");
}
}
Из официального руководства https://developer.android.com/develop/ui/views/layout/webapps/load-local-content :
- Сохраните HTML как актив в
app/src/main/assets/
- Использоватьдля загрузки актива. Постройте его в своем
onCreate()
следующее:
final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
.addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
.addPathHandler("/res/", new WebViewAssetLoader.ResourcesPathHandler(this))
.build();
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
для загрузки веб-контента из ресурса.
- Использовать
assetLoader
из (2) построитьWebViewClient
из (3) и установите его в свойWebView
. Твойindex.html
может быть загружен с использованием https и домена по умолчаниюappassets.androidplatform.net
:
mWebView.setWebViewClient(new LocalContentWebViewClient(assetLoader));
mWebView.loadUrl("https://appassets.androidplatform.net/assets/index.html");
Обратите внимание, что загрузка локальных файлов с использованием веб-URL-адресов вместоfile://
желательно, поскольку это совместимо с политикой того же происхождения.