第六十九讲:Android之WebView(3)

第六十九讲:Android之WebView(三)

进步,意味着目标不断前移,阶段不断更新,它的视影不断变化。——雨果


本讲内容:两个和WebView相关的重要对象:WebChromeClient  和 WebViewClient

和WebView相关的辅助对象,除了WebSettings以外还有WebChromeClient和WebViewClient。


我们通过一个例子感受一下,代码的讲解都写在注释里了,所以我就直接上代码和代码的运行结果。

在assets/html新建一个txet2.html文件

<span style="font-size:18px;"> <script type="text/JavaScript">    
  function alertFuction(){
    var a=1;
    var b=2
    alert(a+b);     
  } 
  function confirmFuction(){ 
     confirm("你确定要删除吗?") 
  } 
  </script>  
<p>对话框测试</p> 
<input onclick="alertFuction()" value="提醒对话框" type="button"> 
<br><br> 
<input onclick="confirmFuction()" value="选择对话框" type="button"> 
<br><br> 
<a href="text1.html">上一页</a></span>


下面是res/layout/activity_main.xml 布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.text1.MainActivity$PlaceholderFragment" >
    <Button
        android:id="@+id/b1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="webViewClient对象方法测试"/>
    <Button
        android:id="@+id/b2"
        android:layout_below="@id/b1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="webViewChromeClient对象方法测试"/>
    <WebView 
        android:id="@+id/webView"
        android:layout_below="@id/b2"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity implements OnClickListener {
	private Button b1;
	private Button b2;
	WebView webView;
	private static final String TAG="MyService";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		b1 = (Button) findViewById(R.id.b1);
		b2 = (Button) findViewById(R.id.b2);
		b1.setOnClickListener(this);
		b2.setOnClickListener(this);

		webView = (WebView) findViewById(R.id.webView);
		// 覆盖默认后退按钮的作用,替换成WebView里的查看历史页面
		webView.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (event.getAction() == KeyEvent.ACTION_DOWN) {
					if ((keyCode == KeyEvent.KEYCODE_BACK)
							&& webView.canGoBack()) {
						webView.goBack();
						return true;
					}
				}
				return false;
			}
		});
		
		// 设置支持Javascript
		webView.getSettings().setJavaScriptEnabled(true);

		// 创建WebViewClient对象
		WebViewClient wvc = new WebViewClient() {
			@Override
			public void onLoadResource(WebView view, String url) {
				Log.i(TAG, "WebViewClient.onLoadResource");
				super.onLoadResource(view, url);
			}

			@Override
			public void onPageFinished(WebView view, String url) {
				Log.i(TAG, "WebViewClient.onPageFinished");
				super.onPageFinished(view, url);
			}

			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				Log.i(TAG, "WebViewClient.onPageStarted");
				super.onPageStarted(view, url, favicon);
			}

			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				Log.i(TAG, "WebViewClient.shouldOverrideUrlLoading");
				webView.loadUrl(url);
				return true;
				// 记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止
				//吧,事件就会不会冒泡传递了,我们称之为消耗掉
			}
		};
		// 设置WebViewClient对象
		webView.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(MainActivity.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;
			}

			// 处理Confirm事件
			@Override
			public boolean onJsConfirm(WebView view, String url,
					String message, final JsResult result) {
				Builder builder = new Builder(MainActivity.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, final JsPromptResult result) {
				// 看看默认的效果
				return super.onJsPrompt(view, url, message, defaultValue,
						result);
			}

			@Override
			public void onReceivedTitle(WebView view, String title) {
				MainActivity.this.setTitle("可以用onReceivedTitle()方法修改网页标题");
				super.onReceivedTitle(view, title);
			}
		};

		// 设置setWebChromeClient对象
		webView.setWebChromeClient(wvcc);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.b1:
			// 加载URL assets目录下的内容可以用 "file:///android_asset" 前缀
			webView.loadUrl("file:///android_asset/html/text1.html");
			break;
		case R.id.b2:
			webView.loadUrl("file:///android_asset/html/text2.html");
			break;
		}
	}
}

下面是运行结果:

第六十九讲:Android之WebView(3)


点击第一个按钮 我们可以看到WebViewClient对象中定义的方法的确被调用了。

第六十九讲:Android之WebView(3)

点击第二个按钮 我们看到加载的网页中有两个按钮,我们知道默认情况下Android会直接忽略掉由javascript弄出来的alert等弹出信息,除非我们在WebChromeClient中覆盖onJsAlert()方法和onJsConfirm()方法,让我们分别点击它们看看效果。

第六十九讲:Android之WebView(3)

第六十九讲:Android之WebView(3)

第六十九讲:Android之WebView(3)



接下来我们再页面中跳转几次后,使用后退按钮,查看我们是否屏蔽了Activity默认的行为,结果当然是屏蔽了


本讲就到这里,Take your time and enjoy it