Android开发--------------WebView(二)之WebView的滑动底部顶部监听,加载进度条等设置

整理一下WebView的一些常用设置,滑动监听,让跳转的页面也在WebView里显示,加载进度,获得标题等等

一,滑动监听

滑动监听的话是需要在WebView基础之上在加强一下,因为在WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个

protected void onScrollChanged(int l, int t, int oldl, int oldt) ;

这个方法。是受到保护的所以我们无法直接使用,所以我们写一个加强的WebView,利用接口回调。

 ScrollWebView

 

package com.song.webviewtest;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.webkit.WebView;
/**
 * Title: ScrollWebView.java
 * Description: 
 * @author Liusong
 * @version V1.0
 */
public class ScrollWebView extends WebView {
	public OnScrollChangeListener listener;

	public ScrollWebView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public ScrollWebView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ScrollWebView(Context context) {
		super(context);
	}

	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {

		super.onScrollChanged(l, t, oldl, oldt);

		float webcontent = getContentHeight() * getScale();// webview的高度
		float webnow = getHeight() + getScrollY();// 当前webview的高度
		Log.i("TAG1", "webview.getScrollY()====>>" + getScrollY());
		if (Math.abs(webcontent - webnow) < 1) {
			// 已经处于底端
			// Log.i("TAG1", "已经处于底端");
			listener.onPageEnd(l, t, oldl, oldt);
		} else if (getScrollY() == 0) {
			// Log.i("TAG1", "已经处于顶端");
			listener.onPageTop(l, t, oldl, oldt);
		} else {
			listener.onScrollChanged(l, t, oldl, oldt);
		}

	}

	public void setOnScrollChangeListener(OnScrollChangeListener listener) {

		this.listener = listener;

	}

	public interface OnScrollChangeListener {
		public void onPageEnd(int l, int t, int oldl, int oldt);
		public void onPageTop(int l, int t, int oldl, int oldt);
		public void onScrollChanged(int l, int t, int oldl, int oldt);

	}

}

 


然后,利用这个加强的WebView就可以监听了

package com.song.webviewtest;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.webkit.WebSettings;

import com.song.webviewtest.ScrollWebView.OnScrollChangeListener;

public class WebViewActivity extends Activity {
	private String url = "http://192.168.30.199:8080/song/test.html";
	
	//执行动作
	public static final int SELECT_IMAGE = 0;// 打开图库
	public static final int OPEN_PAGE = 1;// 跳转其他特定页面
	public static final int CLOSE_OR_BACK = 2;// 关闭或
	
	private ScrollWebView mWebView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_webviw);
		getIntentDatas();
		initView();
		
	}

	private void getIntentDatas() {
		// TODO Auto-generated method stub
		url = getIntent().getStringExtra("url");
	}

	private void initView() {
		mWebView = (ScrollWebView) findViewById(R.id.webview);
		//或的WebView的Setting
		WebSettings settings = mWebView.getSettings();
		//设置支持js,看方法名字就知道啥意思
		settings.setJavaScriptEnabled(true);
		//mWebView.addJavascriptInterface(new JavaScriptInterface(handler), "Android");
	
		mWebView.setOnScrollChangeListener(new OnScrollChangeListener() {
			
			@Override
			public void onScrollChanged(int l, int t, int oldl, int oldt) {
				//滑动中
			}
			
			@Override
			public void onPageTop(int l, int t, int oldl, int oldt) {
				//滑动到顶部
			}
			
			@Override
			public void onPageEnd(int l, int t, int oldl, int oldt) {
				//滑动到底部
			}
		});
		//加载网页路径
		mWebView.loadUrl(url);
	}
	
}


2.让web页面一直在WebView里面显示

 

这需要用到setWebViewClient这个方法,在上面代码里加上这一句就可以了

webview.setWebViewClient(new WebViewClient() {
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				// 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
				// Log.i("TAG", "url--=====>>>" + url);
				view.loadUrl(url);
				return true;
			}

			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				bar.setVisibility(View.VISIBLE);
				progBar.setVisibility(View.VISIBLE);
				// Log.i("TAG", "开始");
			}

			@Override
			public void onPageFinished(WebView view, String url) {
				// Log.i("TAG", "结束");
				bar.setVisibility(View.GONE);
			}

		});


重写public boolean shouldOverrideUrlLoading(WebView view, String url) ,在里面加上view.loadUrl(url);就ok了。

3.然后是加载进度条

需要setWebViewClient和setWebChromeClient配合使用,

首先要在不布局里加上progressBar控件,具体样式自己定义把

<LinearLayout 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"
    android:orientation="vertical" >

    <include layout="@layout/web_top" />

    <ProgressBar
        android:id="@+id/webProgress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:maxHeight="3dip"
        android:minHeight="3dip"
        />

    <com.appsino.bingluo.fycz.ui.web.ScrollWebView
        android:id="@+id/wv_load"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

然后就是获得控件,

	bar = (ProgressBar) findViewById(R.id.webProgress);
	bar.setMax(100);

然后就是设置了,在setWebChromeClien里面有具体的方法返回页面加载进度

webview.setWebChromeClient(new WebChromeClient() {

			public boolean onConsoleMessage(ConsoleMessage cm) {
				
				return true;
			}

			@Override
			public void onProgressChanged(WebView view, int newProgress) {
				bar.setProgress(newProgress);
			}

			@Override
			public void onReceivedTitle(WebView view, String title) {
				super.onReceivedTitle(view, title);
				//tvTitle.setText(title);
			}

		});


onProgressChanged这个方法返回,然后在setWebViewClient里面的onPageStarted和onPageFinished控制进度条的显示于隐藏


4.获得网页标题

在webview.setWebChromeClient(new WebChromeClient() 里面的onReceivedTitle里可以得到网页标题

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。