android的WebView、WebViewClient、WebChromeClient的关系

在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:

onLoadResource、onPageStart、onPageFinish、onReceiveError、onReceivedHttpAuthRequest;

 

WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等

 onCloseWindow(关闭WebView)、onCreateWindow()、onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)、onJsPrompt、onJsConfirm、onProgressChanged、onReceivedIcon、onReceivedTitle;


下面看看这三者之间的应用关系;

package EOE.android.demo1; 
import java.io.FileOutputStream; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.DialogInterface; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Picture; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.webkit.JsPromptResult; 
import android.webkit.JsResult; 
import android.webkit.WebChromeClient; 
import android.webkit.WebViewClient; 
import android.widget.Button; 
import android.widget.Toast; 


public class MainWebView3 extends Activity { 

/** Called when the activity is first created. */ 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

// 定义UI组件 
Button b1 = (Button) findViewById(R.id.Button01); 
Button b2 = (Button) findViewById(R.id.Button02); 
Button b3 = (Button) findViewById(R.id.Button03); 
final WebView wv = (WebView) findViewById(R.id.WebView01); 

// 覆盖默认后退按钮的作用,替换成WebView里的查看历史页面 
wv.setOnKeyListener(new View.OnKeyListener() { 
@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) { 
if (event.getAction() == KeyEvent.ACTION_DOWN) { 
if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) { 
wv.goBack(); 
return true; 


return false; 



}); 


// 设置支持Javascript 


wv.getSettings().setJavaScriptEnabled(true); 


// 定义并绑定按钮单击监听器 


b1.setOnClickListener(new View.OnClickListener() { 


@Override 
public void onClick(View v) { 


// 加载URL assets目录下的内容可以用 "[url=file:///android_asset]file:///android_asset[/url]" 前缀 


wv.loadUrl("[url=file:///android_asset/html/test1.html]file:///android_asset/html/test1.html[/url]"); 





}); 


// 定义并绑定按钮单击监听器 


b2.setOnClickListener(new View.OnClickListener() { 


@Override 
public void onClick(View v) { 




// 加载URL assets目录下的内容可以用 "[url=file:///android_asset]file:///android_asset[/url]" 前缀 


wv.loadUrl("[url=file:///android_asset/html/test3.html]file:///android_asset/html/test3.html[/url]"); 





}); 


// 定义并绑定按钮单击监听器 


b3.setOnClickListener(new View.OnClickListener() { 


@Override 
public void onClick(View v) { 


Picture pic = wv.capturePicture(); 


int width = pic.getWidth(); 


int height = pic.getHeight(); 


if (width > 0 && height > 0) { 


Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 


Canvas canvas = new Canvas(bmp); 


pic.draw(canvas); 


try { 


String fileName = "sdcard/" + System.currentTimeMillis() + ".png"; 


FileOutputStream fos = new FileOutputStream(fileName); 


if (fos != null) { 


bmp.compress(Bitmap.CompressFormat.PNG, 90, fos); 


fos.close(); 





Toast.makeText(getApplicationContext(), "截图成功,文件名是:" + fileName, Toast.LENGTH_SHORT).show(); 


} catch (Exception e) { 


e.printStackTrace(); 











}); 


// 创建WebViewClient对象 


WebViewClient wvc = new WebViewClient() { 


@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 


Toast.makeText(getApplicationContext(), "WebViewClient.shouldOverrideUrlLoading", Toast.LENGTH_SHORT) .show(); 


// 使用自己的WebView组件来响应Url加载事件,而不是使用默认浏览器器加载页面 


wv.loadUrl(url); 


// 记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止吧,事件就会不会冒泡传递了,我们称之为消耗掉 


return true; 





@Override 
public void onPageStarted(WebView view, String url, Bitmap favicon) { 


Toast.makeText(getApplicationContext(), "WebViewClient.onPageStarted", Toast.LENGTH_SHORT).show(); 


super.onPageStarted(view, url, favicon); 





@Override 
public void onPageFinished(WebView view, String url) { 
Toast.makeText(getApplicationContext(), "WebViewClient.onPageFinished", Toast.LENGTH_SHORT).show(); 


super.onPageFinished(view, url); 





@Override 
public void onLoadResource(WebView view, String url) { 


Toast.makeText(getApplicationContext(), "WebViewClient.onLoadResource", Toast.LENGTH_SHORT).show(); 


super.onLoadResource(view, url); 





}; 


// 设置WebViewClient对象 


wv.setWebViewClient(wvc); 


// 创建WebViewChromeClient 


WebChromeClient wvcc = new WebChromeClient() { 


// 处理Alert事件 


@Override 
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { 


// 构建一个Builder来显示网页中的alert对话框 


Builder builder = new Builder(MainWebView3.this); 


builder.setTitle("计算1+2的值"); 


builder.setMessage(message); 


builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 


@Override 
public void onClick(DialogInterface dialog, int which) { 


result.confirm(); 





}); 


builder.setCancelable(false); 


builder.create(); 


builder.show(); 


return true; 







@Override 
public void onReceivedTitle(WebView view, String title) { 


MainWebView3.this.setTitle("可以用onReceivedTitle()方法修改网页标题"); 


super.onReceivedTitle(view, title); 





// 处理Confirm事件 


@Override 
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { 


Builder builder = new Builder(MainWebView3.this); 


builder.setTitle("删除确认"); 


builder.setMessage(message); 


builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 


@Override 
public void onClick(DialogInterface dialog, int which) { 


result.confirm(); 





}); 


builder.setNeutralButton(android.R.string.cancel, new AlertDialog.OnClickListener() { 


@Override 
public void onClick(DialogInterface dialog, int which) { 


result.cancel(); 





}); 


builder.setCancelable(false); 


builder.create(); 


builder.show(); 


return true; 





// 处理提示事件 


@Override 
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, 


JsPromptResult result) { 


// 看看默认的效果 


return super.onJsPrompt(view, url, message, defaultValue, result); 





}; 


// 设置setWebChromeClient对象 


wv.setWebChromeClient(wvcc); 






  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android WebView与JS交互可以通过以下步骤实现: 1. 在Android中创建一个WebView控件,并加载一个网页。 2. 在JS中定义一个函数,用于向Android发送消息。 3. 在Android中设置WebViewWebChromeClientWebViewClient,用于处理JS调用Android的请求。 4. 在Android中定义一个类,用于处理JS发送的消息。 5. 在JS中调用Android定义的函数,向Android发送消息。 6. 在Android中处理JS发送的消息,并执行相应的操作。 通过以上步骤,就可以实现Android WebView与JS的交互。 ### 回答2: AndroidWebView是一个内置的浏览器,可以用于在应用程序中显示网页内容,它支持与JavaScript(JS)代码之间的交互。JS是一种基于Web的编程语言,用于编写客户端脚本,从而使网页变得更加交互性。 在Android中,WebView与JS的交互分为两个部分,即使了解JS代码与Java代码之间的交互方式,了解如何在WebView中设置JS编写的代码。 首先,了解JS代码与Java代码之间的交互方式。JS代码可以在Android应用程序中调用Java方法和接收Java对象。Java代码可以在JS中执行JavaScript。交互的关键是WebChromeClient中的onJsAlert、onJsPrompt、onJsConfirm等方法。这些方法在Web页面向Android应用程序请求调用方法时显示对话框。 其次,设置JS编写的代码。当我们需要在WebView中替换网页的URL地址,就可以利用WebView的loadUrl方法,指定页面的URL地址,然后我们可以在JS中编写JavaScript代码,以从请求的网页中查询所需的数据并将其呈现给用户。而JS和Android之间的交互可以使用WebView的addJavascriptInterface方法,添加一个实例作为JS中的全局变量,从而使JS代码可用于处理数据。 总的来说,WebView与JS交互可以实现与网页的交互,使Android应用程序更加灵活和交互性。为了保持安全性,当在应用程序中使用WebView时,请确保使用最新版本的WebView和JS,并使用可信任的网站。 ### 回答3: 在Android中,Webview是一个基于WebKit引擎的控件,可以在应用程序中加载网页。在许多移动应用程序开发中,我们需要在Webview中实现与JavaScript的交互。这样可以让我们的应用程序更多样化,并且给用户更好的用户体验。 在Android Webview中,与JavaScript进行交互有以下几种方式: 1.调用JavaScript 在Webview中,我们可以使用loadUrl()方法,通过执行JavaScript脚本,从而影响webview中的网页: webview.loadUrl("javascript:jsFunction()"); 其中,jsFunction()代表已在网页中编写的JavaScript函数。 2.JavaScript调用Android原生方法 Webview提供了addJavascriptInterface()方法,用于Java与JavaScript之间的通信。通过这个方法,我们向webview添加一个对象,提供给JavaScript调用: webview.addJavascriptInterface(new AndroidInterface(), "androidObj"); 其中,“AndroidInterface”表示要注入JavaScript的Java对象,而“androidObj”是注入JavaScript的名字。 在JavaScript中,可以通过该对象的name(androidObj)来访问Java方法: androidObj.xxxMethod(); 其中,xxxMethod()是java中定义的供JS调用的方法。 3.使用事件通知 我们可以使用onJsAlert()、onJsConfirm()和onJsPrompt()这些方法来回调JavaScript警报、确认和提示消息。在Java中,这些方法用于捕获JavaScript中的警告、确认和提示消息,使我们能够将消息显示给用户并执行适当的操作。 总结:在Android Webview中,与JavaScript进行交互可以增强应用程序的交互性。通过调用JavaScript、JavaScript调用Android原生方法和使用事件通知,我们可以在应用程序中实现更丰富的交互体验,从而提高用户满意度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值