標籤: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);}@Overrideprotected 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webviw);getIntentDatas();initView();}private void getIntentDatas() {// TODO Auto-generated method stuburl = getIntent().getStringExtra("url");}private void initView() {mWebView = (ScrollWebView) findViewById(R.id.webview);//或的WebView的SettingWebSettings settings = mWebView.getSettings();//設定支援js,看方法名字就知道啥意思settings.setJavaScriptEnabled(true);//mWebView.addJavascriptInterface(new JavaScriptInterface(handler), "Android");mWebView.setOnScrollChangeListener(new OnScrollChangeListener() {@Overridepublic void onScrollChanged(int l, int t, int oldl, int oldt) {//滑動中}@Overridepublic void onPageTop(int l, int t, int oldl, int oldt) {//滑動到頂部}@Overridepublic 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;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {bar.setVisibility(View.VISIBLE);progBar.setVisibility(View.VISIBLE);// Log.i("TAG", "開始");}@Overridepublic 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;}@Overridepublic void onProgressChanged(WebView view, int newProgress) {bar.setProgress(newProgress);}@Overridepublic void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);//tvTitle.setText(title);}});
onProgressChanged這個方法返回,然後在setWebViewClient裡面的onPageStarted和onPageFinished控制進度條的顯示於隱藏
4.獲得網頁標題
在webview.setWebChromeClient(new WebChromeClient() 裡面的onReceivedTitle裡可以得到網頁標題
Android開發--------------WebView(二)之WebView的滑動底部頂部監聽,載入進度條等設定