Android開發--------------WebView(二)之WebView的滑動底部頂部監聽,加載進度條等設置

博客爲 有時個哥 原創,如需轉載請標明出處:http://blog.csdn.net/ls703/article/details/45506117

 

整理一下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裏可以得到網頁標題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章