AndroidでWebViewページのインタラクション
Android内でウェブページを開く時、ウェブページとの相互作用を要求することがあります.これらのインタラクションはjavaScriptに基づいている.それでは、私達はAndroidがどのようにホームページとJSインタラクションするかを勉強します.完全コードは以下の通りです.
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.JavascriptInterface;
import android.webkit.URLUtil;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import org.json.JSONObject;
/**
*
*
* @author ZRP
*/
public class CommonWebActivity extends BaseActivity {
protected CustomFrameLayout customFrameLayout;
protected TextView errorTxt;
protected View refresh;//
protected WebView webView;
protected String url = "";// url
protected String param = "";// , json
protected WebChromeClient chromeClient = new WebChromeClient() {
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
//
if (!NetUtil.isAvaliable()) {
customFrameLayout.show(R.id.common_net_error);
refresh.setVisibility(View.VISIBLE);
refresh.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
webView.loadUrl(url);
}
});
} else {
//
if (!URLUtil.isValidUrl(url)) {
customFrameLayout.show(R.id.common_net_error);
errorTxt.setText(" ");
} else {
customFrameLayout.show(R.id.common_web);
}
}
}
}
// url
public void onReceivedTitle(WebView view, String title) {
setBackView(R.id.back_view, title);
}
// js
public boolean onJsAlert(WebView view, String url, String message, android.webkit.JsResult result){
return super.onJsAlert(view, url, message, result);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
url = getIntent().getStringExtra("url");
param = getIntent().getStringExtra("param");
setContentView(R.layout.common_web_activity);
initView();
}
@SuppressLint("SetJavaScriptEnabled")
private void initView() {
setBackView(R.id.back);
customFrameLayout = (CustomFrameLayout) findViewById(R.id.web_fram);
customFrameLayout.setList(new int[]{R.id.common_web, R.id.common_net_error, R.id.common_loading});
customFrameLayout.show(R.id.common_loading);
refresh = findViewById(R.id.error_btn);
errorTxt = (TextView) findViewById(R.id.error_txt);
webView = (WebView) findViewById(R.id.common_web);
webView.getSettings().setDefaultTextEncodingName("utf-8");
webView.getSettings().setJavaScriptEnabled(true);
synCookies();// cookie, setJavaScriptEnabled
webView.setWebChromeClient(chromeClient);
webView.setWebViewClient(new WebViewClient() {// webView ,
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
webView.addJavascriptInterface(new JavaScriptInterface(), "zrp");
webView.loadUrl(url);
}
/**
* CookieManager Cookie /data/data/databases/ webviewCookiesChromium.db cookies
*
*/
private void synCookies() {
String[] split = App.cookie.split(";");
for (int i = 0; i < split.length; i++) {
CookieManager.getInstance().setCookie(url, split[i]);
}
}
/**
* 。
*
* @param notify 。
*/
public void onNotifyListener(String notify) {
if (webView != null) {
webView.loadUrl("javascript:onCommandListener('" + notify + "')");
}
}
/**
* android js
* String ret = zrp.command("");
* <p/>
* webView.loadUrl("javascript:onCommandListener('param')");
*/
public class JavaScriptInterface {
@JavascriptInterface
public void command(String jsonString) {
if (TextUtils.isEmpty(jsonString)) {
return ;
}
// json
}
}
}
CustomFrameLayout , , :
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
/**
* , 1
*/
public class CustomFrameLayout extends FrameLayout {
private int[] list;
public CustomFrameLayout(Context context) {
super(context);
initView();
}
public CustomFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public CustomFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
/**
* id
*
* @param list
*/
public void setList(int[] list) {
this.list = list;
show(0);
}
/**
*
*
* @param id
*/
public void show(int id) {
if (list == null) {
for (int i = 0; i < getChildCount(); ++i) {
View view = getChildAt(i);
if (id == view.getId()) {
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.GONE);
}
}
return;
}
for (int aList : list) {
View item = findViewById(aList);
if (item == null) {
continue;
}
if (aList == id) {
item.setVisibility(View.VISIBLE);
} else {
item.setVisibility(View.GONE);
}
}
}
/**
*
*/
public void GoneAll() {
if (list == null) {
for (int i = 0; i < getChildCount(); ++i) {
View view = getChildAt(i);
view.setVisibility(View.GONE);
}
return;
}
for (int aList : list) {
View item = findViewById(aList);
if (item == null) {
continue;
}
item.setVisibility(View.GONE);
}
}
/**
* 。
* @param index
*/
public void showOfIndex(int index) {
for (int i = 0; i < getChildCount(); ++i) {
View view = getChildAt(i);
if (index == i) {
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.GONE);
}
}
}
public void initView() {
}
}
:
<?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" >
<include layout="@layout/common_back" />
<com.zrp.test.CustomFrameLayout
android:id="@+id/web_fram"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<WebView
android:id="@+id/common_web"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include layout="@layout/common_net_error" />
<include layout="@layout/common_loading" />
</com.zrp.test.CustomFrameLayout>
</LinearLayout>
, :
web param , asset html ,url : url = "file:///android_asset/html.html";
html.ファイルのソースは の りです.
<!DOCTYPE html>
<html>
<head>
<title> </title>
</head>
<body>
<div class="main">
<button onclick="test2()"> </button>
</div>
<script type="text/javascript">
function test(){
alert(" web ");
}
function test2(){
alert("test2() begin");
zrp.command("{'type':1,'text':'hello boy'}");
alert("test2() end");
}
</script>
</body>
</html>
java js: java webView.loadUrl("javascript:test()");
は、ウェブページコード のtest() を する.
jsはjavaを び します.ウェブページのコードの でbuttonのクリックイベントが られます.zrp.command("{'type':1,'text':'hello boy'}");
を して、jsonをjavaページに ります.つまり、jsは の でjavaの を び しました.
webViewでページを する に、cookie、すなわち をウェブに える がある 、webView.loadUrlを び す に、 のような を び す があります. してください. のクッキー は もset Cookieを う があります.
クッキーの :
/**
* CookieManager Cookie /data/data/databases/ webviewCookiesChromium.db cookies
*
*/
private void synCookies() {
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
String[] split = App.cookie.split(";");
for (int i = 0; i < split.length; i++) {
cookieManager.setCookie(url, split[i]);
}
CookieSyncManager.getInstance().sync();
}
cookie 。
/**
* cookies
*/
private void removeCookie() {
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
}
: Cookie , cookie 。
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setJavaScriptEnabled(true);
! cookie , cookie , , cookie !
:
, :
-
http://blog.csdn.net/swust_chenpeng/article/details/37699841, , cookie, 。。。
-
http://stackoverflow.com/questions/22637409/android-how-to-pass-cookie-to-load-url-with-webview, ! 。
/**
* CookieManager Cookie /data/data/databases/ webviewCookiesChromium.db cookies
*
*/
private void synCookies() {
String[] split = App.cookie.split(";");
for (int i = 0; i < split.length; i++) {
CookieManager.getInstance().setCookie(url, split[i]);
}
}
, cookie, CookieManager.getInstance().removeAllCookie();
、 のユーザがクッキーテーブルに しているすべてのデータをクリアします.