WebView 是Android APP用来处理html页面的一个组件
webview是android中的浏览器控件,在一些手机应用中常会用到b/s模式去开发应用,这时webview的强大功能就会显示出来。
webview的几点设置
权限设置:.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误
js开放设置: 如果访问的页面中有Javascript,则webview必须设置支持Javascript。webview.getSettings().setJavaScriptEnabled(true); 否则,页面的js将不会起作用.
滚动条设置:this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
设置缓存模式:setCacheMode
webView.getSettings().setJavaScriptEnabled(true); webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webView.setHorizontalScrollBarEnabled(false); webView.getSettings().setSupportZoom(true); webView.getSettings().setBuiltInZoomControls(true); webView.setInitialScale(70); webView.setHorizontalScrollbarOverlay(true);WebView主要完成解析、渲染界面。其他交给事件监听对象(WebViewClient)处理各种通知、请求事件;WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
WebViewClient主要帮助WebView处理各种通知、请求事件的,比如:
shouldOverrideUrlLoading:在web页面里单击链接的时候,会自动调用android自带的浏览器来打开链接,需要通过该方法在本页面打开; onLoadResource:加载资源时响应 onPageStart:在加载页面时响应 onPageFinish:在加载页面结束时响应 onReceiveError:在加载出错时响应 onReceivedHttpAuthRequest: 如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。 mWebView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url){ view.loadUrl(url); return true; } });
WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如:
onCloseWindow(关闭WebView) onCreateWindow() onJsAlert (WebView上alert无效,需要定制WebChromeClient处理弹出) onJsPrompt onJsConfirm onProgressChanged onReceivedIcon onReceivedTitle
返回处理
如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前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); }
支持javascripte自定义对象0
可以通过addJavascriptInterface()方法,添加js自定义对象,使用web页面与手机java程序能够进行通信交互
在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了
public class WebViewDemo extends Activity { private WebView mWebView; private Handler mHandler = new Handler(); public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.webviewdemo); mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); mWebView.loadUrl("file:///android_asset/demo.html"); } }
我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。
<html> <mce:script language="javascript"><!-- function wave() { document.getElementById("droid").src="android_waving.png"; } // --></mce:script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="android_normal.png" mce_src="android_normal.png"/> Click me! </a> </body> </html>
这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。
DownloadListener接口
该接口里面有一个方法,onDownloadStart()下载侦听接口,如果客户代码实现该接口,则在下载开始、失败、挂起、完成等情况下,DownloadManagerCore对象会调用客户代码中实现的DownloadListener方法。
这里还有几个知识点:
1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的(今天我是在没有在handler中处理,所以导致webviewclient中的onPageStart方法与addJavascriptInterface中的方法起了冲突,二个人的执行顺序时常互换,之后改成handlder实现,就解决其中的问题,正确的顺序是onPageStart在addJavascriptInterface中的handlder事件处理之前执行)。
看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。
更多的时候,你可以这样
WebView webView= (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true); //WebView对JS的支持
webView.loadUrl(url);
这样你的WebView理论上就能有大部分需要实现的特色了
当然,有些更精彩的内容还是需要你自己添加的
实例:
activity_web.xml:
<?xml version="1.0" encoding="utf-8"?> <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/webView1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
WebActivity.java:
public class WebActivity extends Activity { private static final String LOG_TAG = "WebViewDemo"; private WebView mWebView; private Handler mHandler = new Handler(); final Activity activity = this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web); mWebView = (WebView) findViewById(R.id.webView1); /** * webView的渲染:WebViewClient处理html */ mWebView.setWebViewClient(new WebViewClient() { //覆盖 WebViewClient对象shouldOverrideUrlLoading方法 (目的:使请求的html页面在webView中渲染,而不是Android系统的browser中) @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } //通知事件 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // Handle the error Toast.makeText(getApplicationContext(),"网络连接失败 ,请连接网络。", Toast.LENGTH_SHORT).show(); } }); /** * webView的渲染:WebChromeClient辅助WebView处理Javascript的对话框,加载进度 */ mWebView.setWebChromeClient(new MyWebChromeClient()); /** * webView的渲染:webview对js自定义对象的支持 * (在w3c标准中js有 window,history,document等标准对象, * 同样我们可以在开发浏览器时自定义我们的对象调用手机系统功能来处理) */ WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSavePassword(false); webSettings.setSaveFormData(false); webSettings.setSupportZoom(false); /**webView的渲染:webview对js自定义对象的支持,写法一*/ // mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo"); /**webView的渲染:webview对js自定义对象的支持,写法二:*/ mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()");//加载html文件中的JS方法wave() } }); } }, "demo"); mWebView.loadUrl("http://192.168.1.228:8080/ytj/index.html"); // mWebView.loadUrl("http://183.129.157.219:8086/ytj/index.html"); // mWebView.loadUrl("http://www.etongjin.com.cn/index.html"); } /* * WebChromeClient辅助WebView处理类 */ final class MyWebChromeClient extends WebChromeClient { @Override //WebChromeClient处理Javascript的对话框 (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出) public boolean onJsAlert(WebView view, String url, String message,JsResult result){ Log.d(LOG_TAG, message); result.confirm(); return true; } //WebChromeClient处理进度条 public void onProgressChanged(WebView view, int progress) { activity.setTitle("Loading..."); activity.setProgress(progress * 100); if (progress == 100) activity.setTitle(R.string.app_name); } } /* * webView的渲染:webview对js自定义对象的支持,写法一 */ final class DemoJavaScriptInterface { DemoJavaScriptInterface() { } public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()");//加载html文件中的JS方法wave() } }); } } /** * webView渲染页面的回退(非退出): * 如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身; * 如果希望浏览的网 页回退而不是推出浏览器,需要在当前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); } }
相关推荐
总结来说,WebViewClient和WebChromeClient在Android WebView的使用中扮演着不可或缺的角色。理解它们各自的职责和用法,有助于我们更好地控制网页的加载过程,实现与网页内容的交互,从而提升应用的整体质量。
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页浏览功能,相当于在应用内部构建了一个小型的浏览器。WebView使用WebKit渲染引擎,能够很好地支持HTML、CSS、JavaScript等各种Web...
Android开发中WebView的使用是一个重要的知识点,它允许开发者在Android应用中嵌入网页内容,提供与原生应用相似的用户体验。以下是从提供的文档内容中提取的Android WebView使用相关知识点。 首先,WebView组件是...
这种交互通常是通过`WebChromeClient`和`WebViewClient`接口实现的,其中`addJavascriptInterface()`方法用于暴露Java对象给JavaScript调用,而JavaScript可以通过`window.postMessage()`向Android发送消息。...
在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用程序中嵌入网页内容,实现类似浏览器的功能。本项目“Android-commonwebview通用webview”着重于优化和扩展了原生WebView的功能,以满足更...
总的来说,“Android-android端通用WebView”项目是Android开发中的一个实用工具,它封装了WebView的常见功能,为开发者提供了便利。理解并掌握WebView的相关知识点,对于开发具有网页展示功能的Android应用至关重要...
1. 封装原生 webview,使用 WebViewClient 与 WebChromeClient 2. H5 调用 Native 采用 js prompt 方式 3. Native 调用 H5 采用 loadurl API 使用说明: errorview 和 loadingview 可以自定义 对 WebView 设置...
同时,通过Java层的`WebViewClient`和`WebChromeClient`,我们可以监听网页加载状态和处理JavaScript与Java的交互。 四、生成so库和apk 在cocos2d-x项目中,对于Android平台,你需要编译生成.so动态链接库文件,这...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容。当我们需要在WebView中实现拨打电话的功能时,需要理解Android权限管理、WebView加载本地HTML以及JavaScript与Android原生代码...
为了更好地控制WebView的行为以及与之交互,Android提供了两个关键的类:`WebViewClient`和`WebChromeClient`。这两个类虽然都是用于辅助WebView的工作,但它们各自的功能和应用场景有所不同。 #### WebViewClient ...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,实现与网页的交互。这个“Android高级应用源码-自定义WebView,自带加载动画”压缩包提供了一个实例,展示了如何在WebView的...
1. **WebView的使用**:首先,我们需要了解WebView的基本用法,如加载本地或远程HTML页面,设置WebChromeClient和WebViewClient,以及处理页面的加载进度和错误。 2. **启用文本选择**:默认情况下,WebView禁用了...
总结来说,"CloudJournal-Android-App-using-WebView"项目展示了如何使用Java和Webview组件开发一个轻量级的Android应用,其中服务器承担大部分业务逻辑,而手机端主要负责显示和交互。这种设计模式在许多现代移动...
这份"Android高级应用源码-Android webView和js交互的Demo"就为我们展示了如何实现这种交互。 首先,我们需要了解`WebView`的基本用法。在Android中,我们通过`WebView`类来创建一个可以浏览网页的视图。例如,我们...
在Android应用开发中,Webview模块是一个至关重要的部分,它允许开发者在原生应用中嵌入网页内容,实现丰富的交互体验。本教程由Allen老师指导,旨在帮助开发者构建一个可扩展且高可靠性的Android Webview模块。以下...
在Android开发中,WebView是一个非常重要的组件,它允许开发者在应用程序内部展示网页内容。这篇总结将深入探讨如何在Android应用中有效地使用WebView以及其相关的功能和优化策略。 1. **WebView基本使用** - `...
在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用程序中嵌入网页内容,实现类似浏览器的功能。本资源“Android应用源码之webview重载使用&自定义网址.zip”显然提供了一些示例代码,帮助...
2. 安全性:由于WebView会执行来自网络的代码,所以必须启用安全套接层(SSL)以确保数据传输的安全,并通过`WebViewClient`和`WebChromeClient`监听并处理各种网络事件和用户交互。 3. 性能优化:减少内存占用和提高...