Android组件之WebView

Android组件之WebView,第1张

概述基本步骤联网的权限android.permission.INTERNET如果访问的页面中有Javascript,则webview必须设置支持Javascript。webview.getSettings().setJavaScriptEnabled(true);加载基本的url//创建WebView在onCreate()中WebViewwebview=newWebView(this);setContentView(webv 基本步骤

联网的权限androID.permission.INTERNET

如果访问的页面中有JavaScript,则webvIEw必须设置支持JavaScript。

webvIEw.getSettings().setJavaScriptEnabled(true);

加载基本的url
// 创建WebVIEw在onCreate()中WebVIEw webvIEw = new WebVIEw(this);setContentVIEw(webvIEw);Uri uri = Uri.parse("http://www.example.com");Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);
加载内容
//方式一webvIEw.loadUrl("http://slashdot.org/");//方式二webvIEw.loadData (HTMLText, "text/HTML","utf-8/gbk")//方式三webvIEw.loadDataWithBaseURL(baseUrl,HTMLText,"text/HTML",         "utf-8/gbk",historyUrl)
设置WebChromeClIEntsetWebChromeClIEnt()
WebChromeClIEnt是辅助WebVIEw处理JavaScript的对话框,网站图标,网站Title,加载进度等
	onCloseWindow(关闭WebVIEw) 	onCreateWindow() 	//JavaScript警告对话框显示 返回true/false	onjsAlert() 	//提示对话框 返回true/false	onjsPrompt 	//确认对话框 返回true/false	onjsConfirm 	//当前页面的加载进度	onProgressChanged	//通知主机应用程序的新的标识当前页面 	onReceivedIcon 	//通知主机应用程序的文档标题的改变	onReceivedTitle
设置WebVIEwClIEntset WebVIEwClIEnt()
帮助WebVIEw处理各种通知、请求事件
	//更新历史记录	doUpdateVisitedHistory() 	//重新请求网页数据默认不重新发送	onFormResubmission() 	//加载给定的url指定的资源。	onLoadResource() 	//在页面加载开始时调用	onPageStarted()	//在页面加载结束时调用	onPageFinished() 	//报告错误信息 主要的资源不可用	onReceivedError()	//设置WebVIEw对请求的回应 默认行为是取消请求。	onReceivedhttpAuthRequest() 	//从服务器接收到http错误一直在加载资源。http错误状态码> =400	onReceivedhttpError() 	//SSL错误加载资源时发生 默认行为是取消负载。	onReceivedSslError()  	//WebVIEw发生改变时调用	onScaleChanged()	//重写此方法才能够处理在浏览器中的按键事件。	//返回true/false,true需要对事件进行处理 默认行为返回false。	shouldOverrIDeKeyEvent() 	//在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webvIEw里跳转,不跳到浏览器那边。	//提供WebVIEwClIEnt时,返回true由应用程序进行处理url,返回false当前WebVIEw处理url	shouldOverrIDeUrlLoading(WebVIEw vIEw, String url) 
WebVIEw的WebSettings
	WebSettings webSettings = webVIEw.getSettings();	//支持Js 		setJavaScriptEnabled(true);  	//设置支持缩放 	setBuiltInZoomControls(true); 	//支持缩放	setSupportZoom(true);	//设置缓存模式		setCacheMode();	//将图片调整到适合webvIEw的大小	setUseWIDeVIEwPort(false); 	//缩放至屏幕的大小	setLoaDWithOverviewmode(true);	//支持插件	setPluginsEnabled(true);  	//是否支持多个窗口。	supportMultiplewindows();	//支持内容重新布局  	setLayoutAlgorithm(LayoutAlgorithm.SINGLE_ColUMN); 	//设置可以访问文件   	setAllowfileAccess(true);   	//当webvIEw调用requestFocus时为webvIEw设置节点 默认true	setNeedInitialFocus(true); 	 	//支持通过Js打开新窗口 	setJavaScriptCanopenwindowsautomatically(true);	//支持自动加载图片	setLoadsImagesautomatically(true);  
更多设置
	 //当前加载的进度	 getProgress ()	 //当前加载地址的标题	 getTitle ()	 //停止加载 	 stopLoading()	 //重新加载	 reload()	 //视图滚动的内容这通常是由于scrollBy(int,int)scrollTo(int,int)被调用	 onScrollChanged()
如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开AndroID的系统browser中响应该链接,必须覆盖 webvIEw的WebVIEwClIEnt对象。
mWebVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt()	{        public boolean shouldOverrIDeUrlLoading(WebVIEw vIEw, String url) {                 vIEw.loadUrl(url);                 return true;             }        }); 
如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
public boolean onKeyDown(int keyCode, KeyEvent event) 	{           if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebVIEw.canGoBack()) {                mWebVIEw.goBack();                return true;            }        return super.onKeyDown(keyCode, event);     }
如果希望WebVIEw可以支持JavaScript
  class JsObject {   {@literal @}JavaScriptInterface      public String toString() { return "injectedobject"; }   }   webVIEw.addJavaScriptInterface(new JsObject(), "injectedobject");   webVIEw.loadData("<!DOCTYPE HTML><Title></Title>", "text/HTML", null);    webVIEw.loadUrl("JavaScript:alert(injectedobject.toString())");
举个栗子
local.HTML<HTML><head><Meta http-equiv="Content-Type" content="text/HTML;charset=gb2312"><script type="text/JavaScript">	function javacallJs() {		document.getElementByID("content").INNERHTML += "<br\>java调用了Js函数";	}	function javacallJswithargs(arg) {		document.getElementByID("content").INNERHTML += ("<br\>" + arg);	}</script></head><body>	this is my HTML	<br />	<a onClick="window.wst.startFunction()">点击调用java代码</a>	<br />	<a onClick="window.wst.startFunction('hello world')">点击调用java代码并传递参数</a>	<br />	<div ID="content">内容显示</div></body></HTML>Java public class MainActivity extends Activity {	private WebVIEw contentWebVIEw = null;	private TextVIEw msgVIEw = null;	@Suppresslint("SetJavaScriptEnabled")	@OverrIDe	public voID onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentVIEw(R.layout.main);		contentWebVIEw = (WebVIEw) findVIEwByID(R.ID.webvIEw);		msgVIEw = (TextVIEw) findVIEwByID(R.ID.msg);		contentWebVIEw.getSettings().setJavaScriptEnabled(true);		contentWebVIEw.loadUrl("file:///androID_asset/wst.HTML");		button button = (button) findVIEwByID(R.ID.button);		button.setonClickListener(btnClickListener);		contentWebVIEw.addJavaScriptInterface(this, "wst");	}	OnClickListener btnClickListener = new button.OnClickListener() {		public voID onClick(VIEw v) {			contentWebVIEw.loadUrl("JavaScript:javacallJs()");			contentWebVIEw.loadUrl("JavaScript:javacallJswithargs(" + "'来自Java的问候'" + ")");		}	};	public voID startFunction() {		Toast.makeText(this, "Js java ", Toast.LENGTH_SHORT).show();		runOnUiThread(new Runnable() {			@OverrIDe			public voID run() {				msgVIEw.setText(msgVIEw.getText() + "\njs java ");			}		});	}	public voID startFunction(final String str) {		Toast.makeText(this, str, Toast.LENGTH_SHORT).show();		runOnUiThread(new Runnable() {			@OverrIDe			public voID run() {				msgVIEw.setText(msgVIEw.getText() + "\njs java " + str);			}		});	}}
常见问题onPageStarted()别调用多次

原因: 网址的加载过程中存在重定向问题,所以会被调用多次

解决办法:

public voID onPageStarted(WebVIEw vIEw, String url, Bitmap favicon) { 	if(!isLoading){		isLoading = true;		//Todo someting	}}public voID onPageFinished(){	isLoading = false;}
onPageStarted()调用webVIEw.canGoBack()返回 false

原因:有时在加载网址的时候,需要对当前webvIEw的状态进行判断,例如,自定义了一些前进、后退按钮,便需要实时的刷新按钮,需要在网址发生变化时监听webVIEw;

在onPageStarted()里设置监听,去获取webVIEw 的状态,但是有时会出现上述问题,明明webvIEw是可以返回的,在onPageStarted()里获取的值为false。

解决办法:经过测试onProgressChanged()方法的调用情况,发现,在网络的加载进度在30%左右以后,canGoBack() 才返回 true;所以可以在onProgressChanged() 里加入监听,或是在onPageFinished()里去监听 webVIEw的状态。

低版本上,会出现webvIEw 销毁时 程序发生crash的情况

原因是:销毁的时候出现问题.

解决办法:

if(webVIEw != null) { 	// 要首先移除 	removeVIEw(webVIEw); 	// 清理缓存 	webVIEw.stopLoading(); 	webVIEw.onPause(); 	webVIEw.clearHistory(); 	webVIEw.clearCache(true); 	webVIEw.clearFormData(); 	webVIEw.cleaRSSlPreferences(); 	WebStorage.getInstance().deleteallData(); 	webVIEw.destroyDrawingCache(); 	webVIEw.removeAllVIEws(); 	// 最后再去webVIEw.destroy(); 	webVIEw.destroy(); } 

参见谷歌中国

总结

以上是内存溢出为你收集整理的Android组件之WebView全部内容,希望文章能够帮你解决Android组件之WebView所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/999660.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-21
下一篇2022-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存