android中如何给webview内嵌浏览器

本文详细介绍了Android中使用WebView实现内嵌浏览器的方法,包括常见布局、权限配置、网页加载、事件处理等方面的内容。同时,还提供了处理HTTPS页面加载、进度条显示、JavaScript交互等方面的技巧。

在加载页面过程中,为了避免程序卡死的异常的假象,可以加个进度条,通常在xml文件中进行合理布局,在Java文件中进行逻辑处理,即当页面加载完毕,设置进度条不可见,否则为可见状态

android中常见的布局分为以下五种:(http://jingyan.baidu.com/article/8cdccae964155d315513cd10.html

1.LinearLayout(线性布局)
可以横向(水平)也可以纵向(垂直)排放子元素,每个元素占一行或者每个元素占一列;每一个元素都位于前一个元素之后;layout_weight描述该子元素在剩余空间中占有的大小比例

2.FrameLayout(单帧布局)
最简单的局部,也可以说是层布局方式,所有的子元素统统放于整个界面的左上角,并且后面的子元素直接覆盖在前面的子元素之上

3.RelativeLayout(相对布局)
最灵活的布局,按照各子元素之间的位置关系完成布局,在此布局的子元素里与位置相关的属性将生效,例如layout_below等,在指定的位置关系时,引用的ID必须在引用之前,否则将出现异常

4.AbsoluteLayout(绝对布局)
在此布局中的子元素的android:layout_x属性将生效,用于描述该子元素的坐标位置,此布局中的子元素可以相互重叠,实际中,通常不采用,界面代码过于刚性,可能不能很好适配各种终端

5.TableLayout(表格布局)
 适用于N行N列的布局格式。一个TableLayout由许多TableRow组成,一个TableRow就代表TableLayout中的一行。 TableRow是LinearLayout的子类,TablelLayout并不需要明确地声明包含多少行、多少列,而是通过TableRow,以及其他组件来控制表格的行数和列数, TableRow也是容器,因此可以向TableRow里面添加其他组件,没添加一个组件该表格就增加一列。如果想TableLayout里面添加组件,那么该组件就直接占用一行。在表格布局中,列的宽度由该列中最宽的单元格决定,整个表格布局的宽度取决于父容器的宽度(默认是占满父容器本身)。

1)、XML属性:andriod:collapseColumns
相关用法:setColumnsCollapsed(int,boolean)
说    明:设置需要隐藏的列的序列号,多个用逗号隔开
2)、XML属性:android:shrinkColumns
相关用法:setShrinkAllColumns(boolean)
说    明:设置被收缩的列的序列号,多个用逗号隔开
3)、XML属性:android:stretchColimns
相关用法:setSretchAllColumnds(boolean)
说    明:设置允许被拉伸的列的序列号,多个用逗号隔开


http://blog.youkuaiyun.com/ddddpow/article/details/10179621
制作浏览器


https://www.zhihu.com/question/31316646
webView各种坑

android开发中植入浏览器,主要是webView的加载

C/S架构模式:客户端与服务端架构,利用两端硬件环境优势,将任务合理分配到服务端和客户端来实现,即桌面,如QQ,必须下载才能使用
B/S架构模式:浏览器与服务端架构,通过浏览器实现,如QQ农场,只需网址就可以使用


android开发中在view中内嵌浏览器的方法:

1.在xml中先建好一个webView,在.java中用findViewById将其取出来

2.如何创建webView:
1)、添加权限:AndroidManifest.xml中必须打开权限“android.permission.INTERNET”,否则会出现web page not available的错误
2)、在需要的Activity中生成一个WebView组件:WebView webview=new WebView(this)
3)、设置webView基本信息:
     如果访问的页面中有JavaScript,则webview必须支持JavaScript:webview.getSettings().setJavaScriptEnabled(true);
     触摸焦点起作用:requestFocus();如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事情
     取消滚动条:this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY)
4)、设置webview要显示的网页:
     互联网:webview.loadUrl("http://www.baidu.com")
     本地:webview.loadUrl("file:///android_asset/XX.html"),本地文件存放在:assets文件中

5)、如果希望点击链接由自己处理,而不是新开android的系统browser中响应改链接。
     给webview添加一个事件监听对象(webviewClient),并重写其中一些方法shouldOverrideUrlLoading:对网页中超链接按钮的响应,当按下某个链接时会调用这个方法,并     传递参数:按下的url
     onLoadResource、onPageStart、onPageFinish、onReceiveError、onReceivedHttpAuthRequest

6)、如果用webView点链接看了很多页之后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览器的网页回退而不是退出浏览器      ,需要在当前Activity中处理并消费掉该back事件
     
     覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
    public boolean onKeyDown(in keyCoder,KeyEvent event){
 if(webView.canGoBack()&& keyCoder==KeyEvent.KEYCODE_BACK){
  webView.goBack();//返回webView的上一界面
  return true;
  }
 return false;
        }

webview相关注意问题:
Android的webView很强大,实际上就是一个浏览器,你可以把它嵌入到任何你想要的地方,

webView有两个常用方法:setWebChromeClient和setWebClient

webView可以用来加载http和https网页到本地应用的控件。但是默认情况,通过loadUrl(String url)方法,可以顺利loadUrl(“http://www.baidu.com”)之类的页面。但是,当load通过SSL加密的https页面,但是如果这个网站的安全证书在android无法得到认证,webView就会变成一个空白页,而并不会像自带的浏览器一样弹出提示。因此,我们必须针对这种情况进行处理

处理方式:只需要重载webViewClient的onReceivedSslError即可

具    体:1)、引入类:import androidnet.http.SslError;import android.webkit.SslErrorHandler;
   2)、处理方式:webView.setWebViewClient(new WebViewClient(){//android2.2及更高系统
  @Override
  public void onReceivedSslError(WebView view,SslErrorHandler handler,SslError error){
  
  handler.cancel();默认的处理方式,webView变成空白页
  handler.process();接受所有网站证书,忽略SSL错误,执行访问网页
  handlerMessage(Message msg);其他处理
 }
});

WebViewClient主要帮助WebView处理各种通知、请求事件的,如:onLoadResource、 onPageStart 、onPageFinish 、onReceivedError  、onReceivedHttpAuthRequest

例:webView.setWebViewClient(new WebViewClient(){
 public void onReceivedError(WebView view,int errorCode,String description,String failingUrl){
  Toast.makeText(getApplicationContext(),"网络连接失败,请连接网络",Toast.LENGTH_SHORT).show();
 }
public boolean shouldOverrideUrlLoading(WebView view,String url){//重写此方法表明点击网页里面的链接还是在当前的webView里跳转,不跳到浏览器那边
  view.loadUrl(url);
  return true;
 }

});
//设置字符集编码
webView.getSettings().setDefaultTextEncodingName("UTF-8");
webView.loadUrl("http://www.baidu.com");

 


WebChromeClient主要处理解析,渲染网页等浏览器做的事情,是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等 ,如:
onCloseWindow(关闭WebView) 、onCreateWindow() 、onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出) 、onJsPrompt 、onJsConfirm 、onProgressChanged (加载进度条)、onReceivedIcon 、onReceivedTitle

例://此方法可以处理webView在加载时和加载完成时一些操作
webView.setWebChromeClient(new WebChromeClient(){
 @Override
 public void onProgressChanged(WebView view,int newProgress){
  if(newProgress==100){
  bar.setVisibility(View.INVISIBLE);
  }else{
  if(View.INVISIBLE==bar.getVisibility()){
   bar.setVisibility(View.VISIBLE)
   }
   bar.setProgress(newProgress);
  }
  super.onProgressChanged(view,newProgress);
 }
});

 

总结:用WebChromeClient 可以操作Javascript dialogs(js脚本对话框), favicons(添加收藏的标志), titles(标题), 和 progress(进度条).简单的说,如果除了加载HTML的话,只需要用WebViewClient即可,但是在进行兼容互联网上附加javascript的页面的时候和调用javascript对话框的时候,或者功能较为复杂的内嵌操作的时候,建议使用WebChromeClient 。

 

 

 

 

 

 

转载于:https://my.oschina.net/whzhen1452/blog/812758

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值