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