博客爲 有時個哥 原創,如需轉載請標明出處: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裏可以得到網頁標題