在特定区域停用Android SwipeRefreshLayout

时间:2016-02-28 22:12:05

标签: android webview swiperefreshlayout

我在SwipeRefreshLayout中有一个Webview,工作正常。但是只要我需要在webview中向上滚动,就会调用pull to refresh功能。有没有办法在触摸webview中的特定区域时禁用该功能?这是我的LayoutFile

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android:android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:android="http://schemas.android.com/apk/res/android">

        <WebView
            android:id="@+id/webview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            />
    </android:android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

您需要为webview创建一个触控侦听器。在那里,如果触摸事件坐标在您的目标区域内,您将在父级上调用requestDisallowInterceptTouchEvent(SwipeRefreshLayout)。您需要在事件Up或Cancel上重新启用父项上的触摸事件。

下面这个骨架代码(父是你的SwipeRefreshLayout视图):

switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        if (touch in target area) {
            parent.requestDisallowInterceptTouchEvent(true);
        }
        break;
    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
        if (disallowed parent) {
            parent.requestDisallowInterceptTouchEvent(false);
        }
        break;
    default:
        break;
    }

您也可以尝试在SwipeRefreshLayout视图上调用setEnabled(false)而不是requestDisallowInterceptTouchEvent。

您可以考虑的另一个选项是,只有当webview的滚动Y为0时才启用拉动刷新,因此如果您位于webview内容的顶部。当你开始向下滚动时,你将禁用你的父(SwipeRefreshLayout),当你向上滚动并到达顶部(滚动Y == 0)时,你将重新启用你的父。