最近开发一个需要未联网功能的App, 不熟悉使用Java原生开发界面,于是想使用本地H5做界面,本文测试了使用本地html加载远程数据。直接上代码:
MainActivity.java
package com.alex.webviewlocal;import androidx.appcompat.app.AppCompatActivity;import android.os.Build;import android.os.Bundle;import android.webkit.CookieManager;import android.webkit.WebResourceRequest;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class MainActivity extends AppCompatActivity { private WebView webView; private String url="file:///android_asset/web/index.html"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); webSettings.setJavaScriptEnabled(true); // 设置支持javascript webSettings.setUseWideViewPort(true); // 将图片调整到适合webview的大小 webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); webSettings.setUserAgentString("User-Agent"); webSettings.setLightTouchEnabled(true); // 设置用鼠标激活被选项 webSettings.setBuiltInZoomControls(true); // 设置支持缩放 webSettings.setDomStorageEnabled(true); //设置DOM缓存,当H5网页使用localstorage时,一定要设置 webSettings.setDatabaseEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 设置去缓存,防止加载的为上一次加载的数据 webSettings.setSupportZoom(true); // 设置支持变焦 webView.setHapticFeedbackEnabled(false); webSettings.setPluginState(WebSettings.PluginState.ON); webSettings.setAllowFileAccess(true); webSettings.setAllowContentAccess(true); webSettings.setAllowUniversalAccessFromFileURLs(true); webSettings.setAllowFileAccessFromFileURLs(true); webView.loadUrl(url);// try{// if(Build.VERSION.SDK_INT>=16){// Class<?> clazz = webView.getSettings().getClass();// Method method = clazz.getMethod(// "setAllowUniversalAccessFromFileURLs", boolean.class);// if(method!=null){// method.invoke(webView.getSettings(),true);// }// }// } catch (NoSuchMethodException e) {// throw new RuntimeException(e);// } catch (InvocationTargetException e) {// throw new RuntimeException(e);// } catch (IllegalAccessException e) {// throw new RuntimeException(e);// }//// webView.loadUrl(url);// webView.setWebViewClient(new WebViewClient(){// @Override// public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {// return super.shouldOverrideUrlLoading(view, request);// }// }); }}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"><WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"></WebView></LinearLayout>
h5 文件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./vue.min.js"></script> <script src="./axios.min.js"></script></head><body> <div id="app"> <h2>{{message}}</h2> <ul> <li v-for="user in users" :key="user.id">{{user.name}}</li> </ul> </div> <script> var app = new Vue({ el:'#app', data(){ return { message:'Hello Vue!', users:[] } }, mounted(){ axios.get('https://jsonplaceholder.typicode.com/users').then(response => { this.users = response.data }).catch(error => { console.log(error) }) } }) </script></body></html>
最终效果: