博客为 有时个哥 原创,如需转载请标明出处:http://blog.youkuaiyun.com/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里可以得到网页标题