eug*_*ene 26 android webview swiperefreshlayout
我正在尝试将SwipeRefreshLayout与WebView一起使用.
我正面临着问题,在页面中间,当用户向下滚动时,不必要的刷新开始.
如何在webview的滚动位置位于顶部时才进行刷新事件.(即,他正在查看页面的顶部)?
viz*_*izZ 28
我设法解决它而不必扩展任何东西.看看这个片段(片段特定):
private ViewTreeObserver.OnScrollChangedListener mOnScrollChangedListener;
@Override
public void onStart() {
super.onStart();
swipeLayout.getViewTreeObserver().addOnScrollChangedListener(mOnScrollChangedListener =
new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (mWebView.getScrollY() == 0)
swipeLayout.setEnabled(true);
else
swipeLayout.setEnabled(false);
}
});
}
@Override
public void onStop() {
swipeLayout.getViewTreeObserver().removeOnScrollChangedListener(mOnScrollChangedListener);
super.onStop();
}
Run Code Online (Sandbox Code Playgroud)
有关更广泛的背景,请查看我对Android的回答- 使用空textview的SwipeRefreshLayout.
hiB*_*Lee 20
我认为推荐的方法是扩展SwipeRefreshLayout和覆盖canChildScrollUp()- https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html#canChildScrollUp()
这就是在Google IO 2014计划应用中完成的操作 - https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget /MultiSwipeRefreshLayout.java#L76
的CustomSwipeRefreshLayout可能会是这样的:
public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {
private CanChildScrollUpCallback mCanChildScrollUpCallback;
public interface CanChildScrollUpCallback {
boolean canSwipeRefreshChildScrollUp();
}
public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) {
mCanChildScrollUpCallback = canChildScrollUpCallback;
}
@Override
public boolean canChildScrollUp() {
if (mCanChildScrollUpCallback != null) {
return mCanChildScrollUpCallback.canSwipeRefreshChildScrollUp();
}
return super.canChildScrollUp();
}
}
Run Code Online (Sandbox Code Playgroud)
在你的Activity那个有WebView,
public class FooActivity
implements CustomSwipeRefreshLayout.CanChildScrollUpCallback {
private CustomSwipeRefreshLayout mRefreshLayout;
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// after initialization
mRefreshLayout.setCanChildScrollUpCallback(this);
}
@Override
public boolean canSwipeRefreshChildScrollUp() {
return mWebview.getScrollY() > 0;
}
}
Run Code Online (Sandbox Code Playgroud)
只要实现你的Fragment或Activity有 ViewTreeObserver.OnScrollChangedListener再设置监听像webview.getViewTreeObserver().addOnScrollChangedListener(this);
在onScrollChanged()方法中这样做
@Override
public void onScrollChanged() {
if (webview.getScrollY() == 0) {
swipeLayout.setEnabled(true);
} else {
swipeLayout.setEnabled(false);
}
}
Run Code Online (Sandbox Code Playgroud)
支持库的最新版本具有SwipeRefreshLayout#setOnChildScrollUpCallback允许您避免子类化的方法SwipeRefreshLayout。
mBinding.swipeRefreshLayout.setOnChildScrollUpCallback((parent, child) ->
mBinding.webView.getScrollY() > 10);
Run Code Online (Sandbox Code Playgroud)
您可以通过使用接受 WebView 并使用 WebView 检查滚动位置的自定义 SwipeRefreshLayout 扩展 SwipeRefreshLayout 来解决此问题。
注意:这适用于滚动整个页面,但可能不适用于嵌套滚动。另外,如果您有水平滚动,您可能还想添加此答案中找到的逻辑: https: //stackoverflow.com/a/24453194
public class CustomSwipeToRefresh extends SwipeRefreshLayout {
private final int yScrollBuffer = 5;
private WebView mWebView;
public CustomSwipeToRefresh(Context context, WebView webView) {
super(context);
mWebView = webView;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (mWebView.getScrollY() > yScrollBuffer)
return false;
return super.onInterceptTouchEvent(event);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22539 次 |
| 最近记录: |