Android Webview js 简单应用
来源:互联网 发布:python教程pdf下载 编辑:程序博客网 时间:2024/05/03 17:07
Android 的 Webview 在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。
简单的加载 WebView 界面:
· 带有Http请求头的
loadUrl(String url,Mapadditional HttpHeaders)
· 不带Http请求头的
loadUrl(String url)
· 常用属性:
· clearHistory():清除当前webview访问的历史记录。· reload():重新reload当前的URL,即刷新。常见用法:Back键控制网页后退问题:在不做任何处理前提下 ,浏览网页时点击系统的“Back”键,整个 Browser 会调用 finish()而结束自身 目标:点击返回后,是网页回退而不是推出浏览器· getScrollY():该方法返回的当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离。· getHeight():方法都返回当前WebView这个容器的高度。其实以上两个方法都属于View。· getContentHeight():该方法返回整个HTML页面的高度,但该高度值并不等同于当前整个页面的高度,因为WebView有缩放功能, 所以当前整个页面的高度实际上应该是原始HTML的高度再乘上缩放比例。因此,准确的判断方法应该是if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) {//已经处于底端}if(webView.getScrollY() == 0){//处于顶端}pageUp(boolean top):将WebView展示的页面滑动至顶部。pageDown(boolean bottom):将WebView展示的页面滑动至底部。
解决方案:在当前Activity中处理并消费掉该 Back 事件
public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {mWebView.goBack();return true;}return super.onKeyDown(keyCode, event);}
· 清除网页缓存和 Cookie
CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(getApplicationContext()); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie(); cookieManager.removeAllCookie(); cookieSyncManager.sync();
WebSettings
作用:对 WebView 进行的管理
WebSettings webSettings = webView.getSettings();
· 属性
WebSettings webSettings = webView.getSettings();//如果访问的页面中要与Javascript交互,则webview必须设置支持JavascriptwebSettings.setJavaScriptEnabled(true);// 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量)// 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可webSettings.setPluginsEnabled(true);//设置自适应屏幕,两者合用webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小//缩放操作webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件//其他细节操作webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存webSettings.setAllowFileAccess(true); //设置可以访问文件webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
· 获取WebView的标题
WebChromeClient wvcc = new WebChromeClient() { @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); setTitle(title); } }; webView.setWebChromeClient(wvcc);
· 防止 webview 跳转到系统浏览器
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器 view.loadUrl(url); return true; } });
· 当 webview 加载完成之后
webview.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //自定义操作 } });
· 开启Js
webview.addJavascriptInterface(newgetPayJson()); //方法名 (和后台沟通写一致的)
· 如果对 js 的返回的东西进行修改那么:
onJsAlert: 修改js弹框 (由网页的弹窗修改为原生和自定义的dialog)onJsConfirm:处理confirm弹出框onJsPrompt:处理prompt弹出框
详细代码:
@Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("提示").setMessage(message).setPositiveButton("确定", null); // 不需要绑定按键事件 // 屏蔽keycode等于84之类的按键 builder.setOnKeyListener(new OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { Log.v("onJsAlert", "keyCode==" + keyCode + "event=" + event); return true; } }); // 禁止响应按back键的事件 builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。 return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("提示").setMessage(message).setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(); } }).setNeutralButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { result.cancel(); } }); // 屏蔽keycode等于84之类的按键,避免按键后导致提示消息而页面无法再弹出提示的问题 builder.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { Log.v("onJsConfirm", "keyCode==" + keyCode + "event=" + event); return true; } }); // 禁止响应按back键的事件 // builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("提示").setMessage(message); final EditText et = new EditText(view.getContext()); et.setSingleLine(); et.setText(defaultValue); builder.setView(et).setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(et.getText().toString()); } }) .setNeutralButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); // 屏蔽keycode等于84之类的按键,避免按键后导致提示消息而页面无法再弹出提示的问题 builder.setOnKeyListener(new OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { Log.v("onJsPrompt", "keyCode==" + keyCode + "event=" + event); return true; } }); AlertDialog dialog = builder.create(); dialog.show(); return true; } };
最后贴上这个类的全部代码:带有微信支付宝银联支付
import android.annotation.SuppressLint;import android.content.DialogInterface;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.util.Log;import android.view.KeyEvent;import android.webkit.JavascriptInterface;import android.webkit.JsPromptResult;import android.webkit.JsResult;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.app.AlertDialog;import com.alipay.sdk.app.PayTask;import com.orhanobut.logger.Logger;import com.tencent.mm.sdk.modelpay.PayReq;import com.unionpay.UPPayAssistEx;import com.unionpay.uppay.PayActivity;import android.content.DialogInterface.OnKeyListener;import android.widget.EditText;import org.json.JSONException;import org.json.JSONObject;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;import sdy.com.longjiangtravel.R;import sdy.com.longjiangtravel.app.MyApplication;import sdy.com.longjiangtravel.http.api.UrlApi;import sdy.com.longjiangtravel.http.json.JSONObjectEx;import sdy.com.longjiangtravel.pay.PayResult;import sdy.com.longjiangtravel.utils.AlertView.AlertView;import sdy.com.longjiangtravel.utils.AlertView.OnItemClickListener;import sdy.com.longjiangtravel.utils.AndroidDes3Util;import sdy.com.longjiangtravel.utils.GetToast;import static android.view.KeyEvent.KEYCODE_BACK;/** * Created by admin on 2017/5/2. */public class WebYunkanDetialActivity extends AppCompatActivity { private WebView seckill_webview; private Map<String, String> extraHeaders; private static final int SDK_PAY_FLAG = 1; private static final int SDK_AUTH_FLAG = 2; private String head_title = ""; private String backurl; public static OnR onR; private static final String R_SUCCESS = "success"; private static final String R_FAIL = "fail"; private static final String R_CANCEL = "cancel"; @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { @SuppressWarnings("unchecked") PayResult payResult = new PayResult((Map<String, String>) msg.obj); String resultInfo = payResult.getResult(); String resultStatus = payResult.getResultStatus(); if (TextUtils.equals(resultStatus, "9000")) { new AlertView("提示", "支付成功", "确定", null, null, WebYunkanDetialActivity.this, AlertView.Style.Alert, new OnItemClickListener() { @Override public void onItemClick(Object o, int position) { if (position == -1) finish(); } }).show(); Intent intent = new Intent(getApplicationContext(), MyOrderActivity.class); Bundle bundle = new Bundle(); bundle.putString("tab", "0"); intent.putExtra("data", bundle); startActivity(intent); } else { new AlertView("提示", "取消支付", "确定", null, null, WebYunkanDetialActivity.this, AlertView.Style.Alert, null).show(); Intent intent = new Intent(getApplicationContext(), MyOrderActivity.class); Bundle bundle = new Bundle(); bundle.putString("tab", "0"); intent.putExtra("data", bundle); startActivity(intent); } break; } case SDK_AUTH_FLAG: { } default: break; } } }; public static final String LOG_TAG = "PayDemo"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news); seckill_webview = (WebView) findViewById(R.id.webview); load(); onR = new OnR() { @Override public void onR() { load(); } }; } private void initView() throws Exception { seckill_webview.loadUrl(backurl, extraHeaders); seckill_webview.addJavascriptInterface(new getPayJson(), "honorsoft"); seckill_webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器 view.loadUrl(url); return true; } }); } public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KEYCODE_BACK)) { if (head_title.equals("龙江游详情")) { WebYunkanDetialActivity.this.finish(); } else if (head_title.equals("龙美收银台")) { Intent intent = new Intent(WebYunkanDetialActivity.this, MyOrderActivity.class); Bundle bundle = new Bundle(); bundle.putString("tab", "1"); intent.putExtra("data", bundle); startActivity(intent); WebYunkanDetialActivity.this.finish(); } else { //重新刷机界面(如果没有加载出来数据) load(); } return true; } return super.onKeyDown(keyCode, event); } public class getPayJson { @JavascriptInterface public void getPayJson(String type, String json) throws JSONException { Log.d("xzw", "++++++++++++++" + json); Log.d("xzw", "+---------++++" + type); if (type.equals("alipay")) { payV2(json); } else if (type.equals("wxpay")) { JSONObject jsonObject = new JSONObject(json); PayReq request = new PayReq(); request.appId = jsonObject.getString("appid"); request.partnerId = jsonObject.getString("partnerid"); request.prepayId = jsonObject.getString("prepayid"); request.packageValue = jsonObject.getString("package"); request.nonceStr = jsonObject.getString("noncestr"); request.timeStamp = jsonObject.getString("timestamp"); request.sign = jsonObject.getString("sign"); MyApplication.api.sendReq(request); Intent intent = new Intent(getApplicationContext(), MyOrderActivity.class); Bundle bundle = new Bundle(); bundle.putString("tab", "0"); intent.putExtra("data", bundle); startActivity(intent); } else if (type.equals("unionpay")) { if (type.equals(null)) { } else { JSONObjectEx jsonObject = new JSONObjectEx(json); String tn = jsonObject.getString("tn"); String serverMode = "00"; UPPayAssistEx.startPayByJAR(WebYunkanDetialActivity.this, PayActivity.class, null, null, tn, serverMode); } } } @JavascriptInterface //添加购物车成功: public void ljyCartSuccess() { if (!MyApplication.P2PPreferences.getUid().equals("")) { Log.d("添加购物车成功", "++++++++++=+++==++++"); Intent intent = new Intent(WebYunkanDetialActivity.this, ShoppingCarActivity.class); startActivity(intent); } else { GetToast.useString(WebYunkanDetialActivity.this, "请先登录"); Intent intent = new Intent(WebYunkanDetialActivity.this, LoginActivity.class); startActivity(intent); } } @JavascriptInterface public void ljyCartFail(String message) {// GetToast.useString(WebYunkanDetialActivity.this, message); if (!MyApplication.P2PPreferences.getUid().equals("")) { Log.d("加入购物车失败", "-----------------------"); GetToast.useString(WebYunkanDetialActivity.this, message); } else { GetToast.useString(WebYunkanDetialActivity.this, "请先登录"); Intent intent = new Intent(WebYunkanDetialActivity.this, LoginActivity.class); startActivity(intent); } } @JavascriptInterface public void dotel(String tel) { // GetToast.useString(WebYunkanDetialActivity.this, tel); Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); Uri uri = Uri.parse("tel:" + tel); intent.setData(uri); startActivity(intent); } @JavascriptInterface public void login() { GetToast.useString(WebYunkanDetialActivity.this, "请先登录"); Intent intent = new Intent(WebYunkanDetialActivity.this, LoginActivity.class); startActivity(intent); } //返回 @JavascriptInterface public void ljyDetailBack() { WebYunkanDetialActivity.this.finish(); } //订单相关页面回退地址: @JavascriptInterface public void backUrl(String url) { backurl = url; Log.d("WebYunkanDetialActivity", "url======" + backurl); } //支付回退: @JavascriptInterface public void payGoBack() { Log.d("WebYunkanDetialActivity", "======"); Intent intent = new Intent(WebYunkanDetialActivity.this, MyOrderActivity.class); Bundle bundle = new Bundle(); bundle.putString("tab", "1"); intent.putExtra("data", bundle); startActivity(intent); WebYunkanDetialActivity.this.finish(); } } public void payV2(final String orderInfoJson) { Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(WebYunkanDetialActivity.this); String orderInfo = orderInfoJson; Map<String, String> result = alipay.payV2(orderInfo, true); Log.i("msp", result.toString()); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; Thread payThread = new Thread(payRunnable); payThread.start(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data == null) { return; } String str = data.getExtras().getString("pay_result"); if (str.equalsIgnoreCase(R_SUCCESS)) { GetToast.useid(WebYunkanDetialActivity.this, R.string.pay_success); Intent intent = new Intent(getApplicationContext(), MyOrderActivity.class); Bundle bundle = new Bundle(); bundle.putString("tab", "0"); intent.putExtra("data", bundle); startActivity(intent); } else if (str.equalsIgnoreCase(R_FAIL)) { GetToast.useid(WebYunkanDetialActivity.this, R.string.pay_fail); Intent intent = new Intent(getApplicationContext(), MyOrderActivity.class); Bundle bundle = new Bundle(); bundle.putString("tab", "0"); intent.putExtra("data", bundle); startActivity(intent); } else if (str.equalsIgnoreCase(R_CANCEL)) { GetToast.useid(WebYunkanDetialActivity.this, R.string.pay_cancel); } } public interface OnR { public void onR(); } private void load() { try { final String str = URLEncoder.encode(AndroidDes3Util.encode(MyApplication.P2PPreferences.getUid()), "UTF-8"); backurl = UrlApi.ip_js + "Order/ljyDetail?" + "row_id=" + getIntent().getStringExtra("scenicid") + "&user_id_crypt=" + str + "&mode=AES"; WebSettings setting = seckill_webview.getSettings(); setting.setJavaScriptEnabled(true); WebChromeClient wvcc = new WebChromeClient() { @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); head_title = title; } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("提示").setMessage(message).setPositiveButton("确定", null); // 不需要绑定按键事件 // 屏蔽keycode等于84之类的按键 builder.setOnKeyListener(new OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { Log.v("onJsAlert", "keyCode==" + keyCode + "event=" + event); return true; } }); // 禁止响应按back键的事件 builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。 return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("提示").setMessage(message).setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(); } }).setNeutralButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { result.cancel(); } }); // 屏蔽keycode等于84之类的按键,避免按键后导致提示消息而页面无法再弹出提示的问题 builder.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { Log.v("onJsConfirm", "keyCode==" + keyCode + "event=" + event); return true; } }); // 禁止响应按back键的事件 // builder.setCancelable(false); AlertDialog dialog = builder.create(); dialog.show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); builder.setTitle("提示").setMessage(message); final EditText et = new EditText(view.getContext()); et.setSingleLine(); et.setText(defaultValue); builder.setView(et).setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(et.getText().toString()); } }) .setNeutralButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); // 屏蔽keycode等于84之类的按键,避免按键后导致提示消息而页面无法再弹出提示的问题 builder.setOnKeyListener(new OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { Log.v("onJsPrompt", "keyCode==" + keyCode + "event=" + event); return true; } }); AlertDialog dialog = builder.create(); dialog.show(); return true; } }; seckill_webview.setWebChromeClient(wvcc); extraHeaders = new HashMap<String, String>(); extraHeaders.put("Honorsoft-App", "true"); } catch (Exception e) { e.printStackTrace(); } try { initView(); } catch (Exception e) { e.printStackTrace(); } }}
阅读全文
0 0
- Android Webview js 简单应用
- Android WebView简单应用
- android webview 简单应用
- webview 简单应用
- WebView简单应用
- android应用webview时js接口不能用的问题
- android WebView于js交互应用简例
- Android之WebView简单执行一条JS代码
- Android进阶篇之WebView的简单应用
- Android应用开发-------------WebView(一)之WebView与服务器端的Js交互
- android WebView js 交互
- js android webview
- Js 与Android WebView
- android webview js交互
- android、webview、js交互
- Android webview,js,属性
- android webview js
- android js webview 互调
- 关于Ogre的编译
- 第六篇:Runnable和Thread实现多线程的区别(含代码)
- LDO稳压器工作原理
- CURL
- Hibernate-多对多关系映射
- Android Webview js 简单应用
- Android 连续点击返回键退出程序
- 汇编逻辑运算指令笔记
- 2.4 滚动条(Scroll Bar)使用实例
- java 生成静态页面——Freemarker实例教程
- Java 课下练习题 T2
- c#基础 接口
- r-cnn系列代码编译及解读(4)
- Hadoop 2.x常用端口及查看方法