最近项目中需要在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的判断
不过在官方中我是没有找到。有找到的老铁分享下哈。。。