WebView 简介

简介: WebView 简介 日期: 2013年10月29日 注意: API可能有演进,所以需要看当前时间决定是否有用 继承结构:public class WebView extends AbsoluteLayout implements ViewGroup.OnHierarchyChangeListener ViewTreeObserver.OnGlobalFocusChangeListener 概述 ----- 显示web页面的视图界面(View).本类是你实现自己的浏览器,或者在Activity内部显示在线内容的基础(库)。
WebView 简介

日期: 2013年10月29日
注意: API可能有演进,所以需要看当前时间决定是否有用


继承结构:
public class WebView extends AbsoluteLayout
 implements ViewGroup.OnHierarchyChangeListener ViewTreeObserver.OnGlobalFocusChangeListener

概述
-----
显示web页面的视图界面(View).本类是你实现自己的浏览器,或者在Activity内部显示在线内容的基础(库)。
WebView对象使用WebKit引擎来显示web页面,并提供一些方法,比如可以通过历史记录来前进后退,缩放,执行文本搜索等。
要允许内置的缩放功能,设置 WebSettings.setBuiltInZoomControls(boolean) (在API级别 CUPCAKE[1.6] 中介绍)

注意: 如果要让Activity可以访问互联网,以及Webview加载网页,需要在Android Manifest文件中添加 INTERNET 权限。
 <uses-permission android:name="android.permission.INTERNET" />

这必须是某个元素的子元素(This must be a child of the element. ???This 是指什么 ???)。
想要了解更多信息,请访问 在WebView中创建Web应用


基础用法
-----
默认配置下,WebView对象是一个不像浏览器的组件,不支持JavaScript,忽略网页错误.
如果你只想要显示一些HTML作为UI界面的一部分,那么这很可能是合适的;
在用户浏览的时候,不需要和web页面进行交互,而网页也不需要和用户进行互动。
如果确实想要一个全功能稳定的web浏览器,你可能想要通过一个URL Intent来启动浏览器程序,而不是在自己的WebView里显示。
示例如下:
Uri uri = Uri.parse("http://www.ieternal.com");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);

详情参见: Intent

要在Activity中提供WebView,可以在layout中声明,或者在 onCreate() 方法中设置整个Activity的window界面为 WebView:
 WebView webview = new WebView(this);
 setContentView(webview);

然后加载所需的web页面:

 // 最简单的用法: 注意这种情况下,加载页面时如果有错误,并不会有异常(exception)抛出
 webview.loadUrl("http://m.ieternal.com/");


 // 或者,你也可以从  HTML 字符串加载内容:
 String summary = "<html><body>您的成绩: <b>192</b> 分.</body></html>";
 webview.loadData(summary, "text/html", null);
 // ... 需要注意此处的HTML能做的事有一些限制.
 // 想要了解更多,请查看JavaDocs, loadData() 和 loadDataWithBaseURL()方法.

可以通过以下几点来配置WebView的行为:

1. 创建并设置 WebChromeClient 的子类对象。当有可能影响浏览器 UI界面的事件发生时,此类将被调用. 例如: 进度条更新,以及 JavaScript 弹出alert警告。
2. 创建并设置 WebViewClient 的子类对象.当有可能影响内容渲染的事件发生时,此类将被调用.比如: 页面错误,表单提交等.通过shouldOverrideUrlLoading() 方法,可以对URL进行过滤和拦截().
3. 修改 WebSettings.比如通过setJavaScriptEnabled()方法启用JavaScript支持.
4. 使用 addJavascriptInterface(Object, String) 方法注入 Java对象 到JS上下文(window.XXX),则在页面中可以通过JavaScript访问或调用.


以下是一个复杂一些的例子,显示错误处理,设置,以及页面加载进度信息.
 // 本示例代码在activity的标题栏中显示页面加载进度信息, 如同浏览器应用一样.
 getWindow().requestFeature(Window.FEATURE_PROGRESS);


 webview.getSettings().setJavaScriptEnabled(true);


 final Activity activity = this;
 webview.setWebChromeClient(new WebChromeClient() {
   public void onProgressChanged(WebView view, int progress) {
     // Activitiy 以及 WebView 通过不同的比例来显示进度信息.
     // 当进度达到 100%以后将会自动隐藏
     activity.setProgress(progress * 1000);
   }
 });
 webview.setWebViewClient(new WebViewClient() {
   public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
     Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
   }
 });


 webview.loadUrl("http://slashdot.org/");

Cookie 和 window 管理
------
因为安全方面的限制,你的应用拥有自己的cache,cookie存储,很明显,并不能共享浏览器app的数据.
默认情况下,在页面内部,不论是通过JavaScript调用还是< a >标签的target属性请求打开新的window,都会被忽略。
你也可以自定义  WebChromeClient 来支持多窗口(标签),并按你想要的方式来展示他们.


当设备的方向或其他配置改变之后,Activity的标准行为是被摧毁(destroyed),然后重新创建(recreated),因此会导致WebView重新加载当前页面.如果你不想要这种结果,你可以让Activity自己处理 orientation 和 keyboardHidden 相关事件,然后不管WebView. WebView会合适地管理自身的改变方向事件。想要了解在运行时如何处理配置信息的改变,请 点击这里.

构建兼容不同屏幕密度的web页面
--------
设备的屏幕密度基于其分辨率。密度越低的屏幕在每英寸上的可用像素越少,当然密度越高的每英寸上就更多(甚至高好几倍).
屏幕的dpi是很重要的,在其他条件都相同的情况下,一个UI元素(如button)的宽和高都被指定了屏幕像素以后,在低密度屏幕上显得更大,在高密度屏幕上显得更小.为了简单起见,Android将各种实际的屏幕密度规整为三种分辨率: high, medium, 以及 low


默认情况下,WebView缩放web页面以匹配中等密度的屏幕。所以在高分屏上放大为1.5倍(因为单个像素所占的地方更小),在低分屏上缩小为0.75倍(单个像素点更大)。
从API级别ECLAIR(2.0)开始,WebView支持 DOM,CSS以及 meta 标签特性 以帮助web开发者适配不同屏幕密度.


以下是用于处理不同屏幕密度的方式:
1. DOM属性 window.devicePixelRatio; 此属性的值指定当前设备的默认缩放因子。举例来说,如果这个值为"1.0",则按照mdpi设备来处理,如果值为"1.5"则当做hdpi设备,如果为"0.75"则当做低分屏并且缩小为0.75倍.
2. CSS媒体查询元素 -webkit-device-pixel-ratio; 此元素可以在兼容的设备指定屏幕密度。相应的值只能是 "0.75","1"和"1.5",用于指定此style样式适用于哪种密度的屏幕. 例如:
<link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="hdpi.css" />

此处, hdpi.css 只兼容像素比为1.5(即高密度)的屏幕。

HTML5 视频(Video)支持
为了在app中支持HTML5内置的video支持,需要开启硬件加速。并为WebView设置一个WebChromeClient对象. 要支持全屏播放,必须实现 onShowCustomView(View, WebChromeClient.CustomViewCallback) 和 onHideCustomView() 方法, 可选实现 getVideoLoadingProgressView().



目录
相关文章
|
移动开发 前端开发 JavaScript
鸿蒙-webview的使用和JS交互(附源码)
日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 那么鸿蒙之中用到的技术是什么呢?WebView 在此之前,先看一个报错 ​ App Launch: The Huawei Lite Simulator supports only Lite projects.
339 0
鸿蒙-webview的使用和JS交互(附源码)
|
存储 负载均衡 安全
【Unity干货教程】如何实现Unity和Android原生互相调用?
Unity是一个跨平台开发工具,发布到移动平台也是大部分Unity开发者的必备技能。而由于Unity跨平台的特性,总会遇到在移动平台的技术细节支持不够,或者需要在调用其他原生插件的情况。这里我们说一下如何在Android Studio中创建一个可供Unity调用的aar插件,以实现Unity和Android原生互相调用的目的。
|
JavaScript 前端开发 Android开发
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
Android开发学习笔记:浅谈WebView
|
缓存 JavaScript Android开发
WebView使用相关笔记(一)
一、WebView常用的方法: 1、加载url // 1、加载一个网页 wvDeviceInfo.loadUrl("https://www.
1147 0
|
Android开发 前端开发
Android开发之WebView
感觉在显示信息时,用途还可以的。 只是不知和React Native的应用场合有何分别?
1654 0
|
移动开发 JavaScript Android开发
|
机器学习/深度学习 Web App开发 缓存
WebView深度学习(一)之WebView的基本使用以及Android和js的交互
前言:随着市场需求的不断变化,原生安卓已经无法满足客户的需要了,现在很多app都在使用Android和h5的交互实现某些功能,比如商品详情页,文章详情页面,商品点评页面,还有某些复杂的展示页面等等,设置登陆页面都有可能是和js交互做到的。
2010 0
|
移动开发 JavaScript Java
android webview增强版,对原生webview的一些解决方案
MWebView 根据 Tamicer/JsWebView 修改定制 为什么要使用WebView 随着app业务的不断深入发展,只靠着原生代码来堆砌功能是不现实,毕竟开发的时长会增加,而且同时需要开发iOS和Android两套,并且,如果在UI上改变了一丁点,都需要提包(虽然Android现在可以进行热更新,但是热更新不是100%能生效的,其中的原理只要了解过的
3541 0