После нескольких дней исследований я нашел решение.
В этом случае мы можем удалить NestedScrollView
из макета и использовать OnScrollChangeListener
для управления прокруткой WebView. Конечно, с API 23+ мы можем использовать его напрямую, но для API <23 мы действуем следующим образом: </p>
ObservableWebView
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
public class ObservableWebView extends WebView {
private OnScrollChangedCallback mOnScrollChangedCallback;
public ObservableWebView(final Context context)
{
super(context);
}
public ObservableWebView(final Context context, final AttributeSet attrs)
{
super(context, attrs);
}
public ObservableWebView(final Context context, final AttributeSet attrs, final int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt)
{
super.onScrollChanged(l, t, oldl, oldt);
if(mOnScrollChangedCallback != null) mOnScrollChangedCallback.onScroll(l, t, oldl, oldt);
}
public OnScrollChangedCallback getOnScrollChangedCallback()
{
return mOnScrollChangedCallback;
}
public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback)
{
mOnScrollChangedCallback = onScrollChangedCallback;
}
/**
* Implement in the activity/fragment/view that you want to listen to the webview
*/
public static interface OnScrollChangedCallback
{
public void onScroll(int l, int t, int oldl, int oldt);
}
}
и вам нужно реализовать интерфейс OnScrollChangedCallback, а затем проверить позицию scrollY веб-просмотра, чтобы включить или отключить swiperefresh:
ObservableWebView webView= findViewById(R.id.main_webView);
/**
*
* @param l Current horizontal scroll position.
* @param t Current vertical scroll position.
* @param oldl Previous horizontal scroll position.
* @param oldt Previous vertical scroll position.
*/
webView.setOnScrollChangedCallback(new OnScrollChangedCallback(){
public void onScroll(int l, int t, int oldl, int oldt){
if (t == 0) {
swiperefresh.setEnabled(true);
} else {
swiperefresh.setEnabled(false);
}
}
});