最近项目中需要在webview添加个下拉刷新,继而出现了滑动冲突问题。使用swiperefreshLayout,webview(或者X5WebView)嵌套使用,webview下划滚动没有问题,但是上划滚动时,执行了swiperefreshLayout 的刷新动作,这并不是我想要的效果。
需要效果:上划滚动时webview需能直接滚动。只有当webview上划滚动到顶部,才能触发swiperefreshLayout 刷新。
swiperefreshLayout 作为谷歌推出的下拉刷新库,并没有内部处理这些手势分配。官网给了个api。 说如果子布局想滚动 重写 canChildScrollUp () 。实际上并不是很好操作。搜了很多blog 都没有用,下面给出有效的解决方式。适用与腾讯的X5WebView。
解决方式 : 基于需要效果,关键是识别到 webview 什么时候滚到顶部再把手势给 swiperefreshLayout 就可以了。只是 webView.getScrollY() 总是 =0 。 解决方式:
import com.tencent.smtt.sdk.WebView; import android.content.Context; import android.util.AttributeSet; /** * 重定义webview 这里继承的是X5WebView */ public class ScrollWebView extends WebView { public interface IScrollListener { void onScrollChanged(int scrollY); } private IScrollListener mScrollListener; public void setOnScrollListener(IScrollListener listener) { mScrollListener = listener; } public ScrollWebView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); //只要是通过webview的滚动距离 t if (mScrollListener != null) { mScrollListener.onScrollChanged(t); } } }在activity中这样调用:
mWebView.setOnScrollListener(new IScrollListener() { @Override public void onScrollChanged(int scrollY) { //这是我项目的刷新(到时候去掉,用下面的判断) if (scrollY == 0)//webView在顶部 { mPb.setRefreshEnabled(true); } else { mPb.setRefreshEnabled(false); } //swiperefreshLayout刷新 // if (t == 0) {//webView在顶部 // swipeLayout.setEnabled(true); // } else {//webView不是顶部 // swipeLayout.setEnabled(false); // } } });网上查找资料,有老铁提供的x5webview的判断 不过在官方中我是没有找到。有找到的老铁分享下哈。。。
