标签:
由于H5页面在移动端的兼容性及扩展性方面体现出来的优势,又兼得APP中植入H5页面对应用的灵活性有大大的提升(如活动、游戏的更新等),APP开发不可避免的需要加载一些H5页面,但安卓客户端对网页内容的排版、整理、交互等可能会出现一些不可预料的问题。本文将对安卓端加载网页写一些比较通用,可能避免问题的统一的解决方法总结。
package com.example.webviewtest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.KeyEvent;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@SuppressLint("SetJavaScriptEnabled")
public class WebViewActivity extends FragmentActivity {
private WebView webView;
private Context context;
private Activity activity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
context = this;
activity = this;
initView();
}
//
private void initView() {
webView = (WebView) findViewById(R.id.game_WV);
initWebView();
}
@SuppressLint("NewApi")
private void initWebView() {
if (Build.VERSION.SDK_INT >= 19) {
webView.getSettings().setCacheMode(
WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
activity.setTitle("Loading...");
activity.setProgress(newProgress * 100);
if (newProgress == 100) {
activity.setTitle(R.string.app_name);
}
}
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
return super.onJsAlert(view, url, message, result);
}
});
webView.setWebViewClient(new GameWebViewClient());
WebSettings s = webView.getSettings();
s.setJavaScriptEnabled(true);
webView.loadUrl(Constants.url);
}
class GameWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view,
String url_Turntable) {
view.loadUrl(url_Turntable);
return true;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
handler.proceed();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
@Override
public void onPageFinished(WebView view, String url) {
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
这里简单介绍下,为何webView既要setWebClient,又要setWebChromeClient,这两者并不是因为4.4以后webView采用了chromium的内核所以以后就舍弃了WebClient(之前有不少童鞋误解了),其实两者是相辅相成的:if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
WebView.setWebContentsDebuggingEnabled(true);
})。另外可能需要翻墙(这点很。。。,不过貌似只要翻墙一次即可)s.setDomStorageEnabled(true);经测试成功!
<?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" >
<org.xwalk.core.XWalkView
android:id="@+id/game_WV"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>package com.example.webviewtest;
import org.xwalk.core.XWalkResourceClient;
import org.xwalk.core.XWalkView;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
@SuppressLint("SetJavaScriptEnabled")
public class CrossWalkActivity extends FragmentActivity {
private XWalkView webView;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crosswalk);
context = this;
initView();
}
//
private void initView() {
webView = (XWalkView)findViewById(R.id.game_WV);
initWebView();
}
private void initWebView() {
webView.setResourceClient(new GameWebViewClient(webView));
webView.load(Constants.url,null);
}
class GameWebViewClient extends XWalkResourceClient{
public GameWebViewClient(XWalkView view) {
super(view);
}
@Override
public void onLoadStarted(XWalkView view, String url) {
super.onLoadStarted(view, url);
}
@Override
public void onLoadFinished(XWalkView view, String url) {
super.onLoadFinished(view, url);
}
}
}
<?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" >
<org.apache.cordova.CordovaWebView
android:id="@+id/game_WV"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
package com.example.webviewtest;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.cordova.CordovaChromeClient;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaPreferences;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaWebViewClient;
import org.apache.cordova.PluginEntry;
import org.apache.cordova.Whitelist;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.KeyEvent;
@SuppressLint("SetJavaScriptEnabled")
public class CordovaActivity extends FragmentActivity implements CordovaInterface {
private final ExecutorService threadPool = Executors.newCachedThreadPool();
private CordovaWebView webView;
private int activityRequestCode;
private CordovaPlugin activityResultCallBack;
private CordovaPreferences prefs = new CordovaPreferences();
private Whitelist internalWhitelist = new Whitelist();
private Whitelist externalWhitelist = new Whitelist();
private ArrayList<PluginEntry> pluginEntries;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cordova);
context = this;
initView();
}
//
private void initView() {
webView = (CordovaWebView)findViewById(R.id.game_WV);
initWebView();
}
private void initWebView() {
internalWhitelist.addWhiteListEntry("*", false);
externalWhitelist.addWhiteListEntry("tel:*",false);
externalWhitelist.addWhiteListEntry("sms:*", false);
prefs.set("loglevel", "DEBUG");
webView.init(this, makeWebViewClient(webView), makeChromeClient(webView), pluginEntries, internalWhitelist, externalWhitelist, prefs);
webView.loadUrlIntoView(Constants.url);
}
private CordovaWebViewClient makeWebViewClient(CordovaWebView webView){
return webView.makeWebViewClient(this);
}
private CordovaChromeClient makeChromeClient(CordovaWebView webView){
return webView.makeWebChromeClient(this);
}
@Override
public Activity getActivity() {
// TODO Auto-generated method stub
return this;
}
@Override
public ExecutorService getThreadPool() {
// TODO Auto-generated method stub
return threadPool;
}
@Override
public Object onMessage(String arg0, Object arg1) {
if(arg0.equals("onPageStarted")){
}
if(arg0.equals("onPageFinished")){
}
return null;
}
@Override
public void setActivityResultCallback(CordovaPlugin arg0) {
if(activityResultCallBack != null){
activityResultCallBack.onActivityResult(activityRequestCode, Activity.RESULT_CANCELED, null);
}
this.activityResultCallBack = arg0;
}
@Override
public void startActivityForResult(CordovaPlugin arg0, Intent arg1, int arg2) {
setActivityResultCallback(arg0);
startActivityForResult(arg1, activityRequestCode);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
}
return super.onKeyDown(keyCode, event);
}
}
标签:
原文地址:http://blog.csdn.net/zcchange1025/article/details/50154827