关于android WebView的问题

启-骋 2016-03-20 09:28:39
我尝试给android中webView添加下拉刷新功能,因此我就需要判定当前用户再拖动的网页是否再顶部,如果在顶部,并且用户是在向下拉动,那么这个时候就可以拖动我的刷新头进行刷新。我直接用的getscrollY来判定的,当然,我夜使用到了onscrollchange(),computeVerticalScrollOffset(),computeVerticalScrollRange(),computeVerticalScrollExtent()等等的方式,最后发现居然是因为某些网页我在调用getscrollY获取滚动距离的时候,始终返回的都是0,并且直接没有回调onscrollchange()方法,然后computeVerticalScrollOffset始终等于0,computeVerticalScrollRange和computeVerticalScrollExtent相等,这个时候我就怀疑是网页编写所用代码的问题了!但是因为我又不熟悉网页编写!所以,再这里请教各位大神有没有遇到我这种奇葩问题?如果有的话请问有没有办法能够正确获取这种网页滚动的距离!这种网页就想手机端的淘宝页面!给个图把!



坐等大神解答!
...全文
436 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lee3219237 2017-12-29
  • 打赏
  • 举报
回复
10楼亲测可用
MoneeWang 2017-09-08
  • 打赏
  • 举报
回复
楼上方法管用谢谢
冰凉的右手cp 2017-04-15
  • 打赏
  • 举报
回复
研究了两天终于想到了解决方案。楼主跟我遇到的问题就是想在webview外部加下拉效果,关键问题是找到webview里网页是否到了顶端, 一般情况下使用webview.getScrollY()==0是没有问题的,可是有些网页的滚动条使用JS实现使得webview.getScrollY()始终等于0。 我换个了角度把webview的overScrollMode设置成always, 利用android里的overScrollBy的偏移值确定是否可以下拉,如果偏移值不小于0说明还在webview内滚动: import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.webkit.WebView; /** * Created by caipu on 2017/4/15. */ public class MyWebview extends WebView{ private boolean isTop = false; public MyWebview(Context context) { super(context); } public MyWebview(Context context, AttributeSet attrs) { super(context, attrs); } public MyWebview(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { if(scrollY <= 0){ if(!isTop && deltaY < 0){ isTop = true; } } return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); } @Override protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); } public boolean isTop() { return isTop; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: isTop = false; break; case MotionEvent.ACTION_UP: isTop = false; break; } return super.onTouchEvent(event); } } 判断是否可以下拉的代码: protected boolean isReadyForPullStart() { return webview.getScrollY() == 0 && webview.isTop(); }
冰凉的右手cp 2017-04-14
  • 打赏
  • 举报
回复
楼主解决了吗?我也很纠结
启-骋 2016-03-23
  • 打赏
  • 举报
回复
貌似这个问题的真正原因是因为网页编辑者把代码都都放在了标题里面,而默认的webView只能获取body的内容 ,但是真正的内容不再body里面导致的始终为0的情况,就这样把!
启-骋 2016-03-22
  • 打赏
  • 举报
回复
4L说的不是一回事哈!谢谢答复!
哎,真难 2016-03-22
  • 打赏
  • 举报
回复
这貌似是写在页面里面的吧
启-骋 2016-03-22
  • 打赏
  • 举报
回复
不是的,网页是网页,下拉刷新是下拉刷新,没有放在网页里面哈!
wei220000 2016-03-21
  • 打赏
  • 举报
回复
既然网站已经有下拉刷新了,你还要自己去控制?
xiaohuh421 2016-03-21
  • 打赏
  • 举报
回复
你看过淘宝的源码吗? 估计别个的下接刷新是在网页内实现的呢, 不定是原生app实现.
qq_26763799 2016-03-21
  • 打赏
  • 举报
回复
PullToRefreshWebView 可以去github搜下,这个pulltoreflash系列里都有,listview,gridview,scrollview都有对应的pulltoreflash
启-骋 2016-03-21
  • 打赏
  • 举报
回复
1L说的问题,我觉得不太可能。一般一个浏览器关于刷新都是通过调用reload()函数进行更新的,没有听说过内部写的刷新!!!2L说的网站控制,不好意思!我没有理解你的意思!你说的应该是浏览器默认的刷新按钮吧。但是现在我是在重新写一个内置浏览器,所以,你说的那个刷新不存在!所以需要我自己去写!当然,本来可以通过很简单的方法是刷新,只是我采用了一个下拉刷新的效果而已!谢谢!

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧