web开发越来越活跃,大多app内嵌套html已经是非常平常的事情,在android中有许多js加载问题及微信支付问题,还有显示问题,以下是我这几天的学习所整理的一些方法,在这里发布以下
打开webview ,url为地址,replace("\\", "") 去除多余的斜杠,android接受json的地址会多出来几条斜杠,这样会造成web无法显示的问题
startActivity(WebActivity.newIntent(this, url.replace("\\", ""),"积分商城"));
xlm(主要就这一句,不多BB)
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
java代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);webview = findviewbyid(R.id.webview); iniview();//引用控件 setwebviewbackgrand();//服务,中有加载处理方法和打开微信支付方法
}
博主比较懒,简单的代码就不备注了
private void iniview() { web_view = (WebView) findViewById(R.id.webView); weiuri = new String(stringExtra); WebSettings webSettings = web_view.getSettings();//初始化WebSettings 获取web服务 webSettings.setPluginState(WebSettings.PluginState.ON);//过期方法, webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小 webSettings.setJavaScriptEnabled(true);//启用js webSettings.setBlockNetworkImage(false);//解决图片不显示 webSettings.setAppCacheEnabled(true);//设置是否打开。默认关闭,即,H5的缓存无法使用。 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setAllowFileAccess(true);// 设置允许访问文件数据 webSettings.setSupportZoom(true);//支持缩放 webSettings.setBuiltInZoomControls(true);//进行控制缩放。由于某些原因需要在该activity的onDestroy方法里面调用webView.destroy()。当进入该webview并且进行缩放操作时,退出该activity程序崩溃 webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//自动打开窗口 if (URL.endsWith(".html")) { web_view.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); } else { web_view.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); } webSettings.setDomStorageEnabled(true);//设置支持DomStorage webSettings.setDatabaseEnabled(true);//设置支持本地存储 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){//这个很重要 不接受了 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } web_view.requestFocus();//缓存 //设置响应js 的Alert()函数 web_view.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { AlertDialog.Builder b = new AlertDialog.Builder(WebActivity.this); b.setTitle("提示"); b.setMessage(message); b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }); b.setCancelable(false); b.create().show(); return true; } //设置响应js 的Confirm()函数 @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { AlertDialog.Builder b = new AlertDialog.Builder(WebActivity.this); b.setTitle("confirm"); b.setMessage(message); b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }); b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); b.create().show(); return true; } //设置响应js 的Prompt()函数 @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final View v = View.inflate(WebActivity.this, R.layout.prompt_dialog, null); ((TextView) v.findViewById(R.id.prompt_message_text)).setText(message); ((EditText) v.findViewById(R.id.prompt_input_field)).setText(defaultValue); AlertDialog.Builder b = new AlertDialog.Builder(WebActivity.this); b.setTitle("prompt"); b.setView(v); b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String value = ((EditText) v.findViewById(R.id.prompt_input_field)).getText().toString(); result.confirm(value); } }); b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }); b.create().show(); return true; } }); web_view.loadUrl(weiuri);//打开webview weiuri是连接地址 }
这里主要用于微信支付操作,正常android自带的web是打不开微信,这里做的就是简单的拦截费网站页面和跳转微信支付的操作
private void setwebviewbackgrand() { web_view.setPictureListener(new WebView.PictureListener() { @Override public void onNewPicture(WebView view, Picture picture) { //移除动画或者删除背景图片 } }); web_view.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { //网页加载失败的处理,一般是出错图片,跳转到出错处理页面 super.onReceivedError(view, errorCode, description,failingUrl); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器 if (url.startsWith("http:") || url.startsWith("https:")){ view.loadUrl(url); Map<String, String> extraHeaders = new HashMap<String, String>(); extraHeaders.put("Referer", "http://www.jxzwawa.cn"); view.loadUrl(url, extraHeaders); return false; }else { if (url.startsWith("weixin://wap/pay?")) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); } return true; } } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (view.getTitle().length() != 0) { mTitleBar.setTitle(view.getTitle()); } WebActivity.this.setTitle(view.getTitle()); //网页加载结束的处理,可以停止动画 } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageFinished(view, url); if (view.getTitle().length() != 0) { mTitleBar.setTitle(view.getTitle()); } WebActivity.this.setTitle(view.getTitle()); //网页加载开始的处理,开始动画 } }); }顺便带一个退出操作
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK && web_view.canGoBack()) { web_view.goBack(); return true; } else { finish(); } return true; }
xml.prompt_dialog
<?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"> <TextView android:id="@+id/prompt_message_text" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/prompt_input_field" android:layout_width="match_parent" android:layout_height="wrap_content" android:minWidth="250dp" android:selectAllOnFocus="true" android:scrollHorizontally="true"/> </LinearLayout>
代码比较简单 站过去就能用 不给dome了 希望各路大神多多指点。
如果帮助到各位请留言告诉我 如果没帮助到了 如果我知道会告诉你 不过 我项目已经不用这个了 用qq游览器的内核 比自带的块很多倍