ViewPager + Seekbar:尝试滑动搜索栏时,viewPager会更改片段

时间:2019-02-06 17:29:41

标签: java android android-viewpager seekbar

我有一个带有三个片段的viewPager。中间(第二个)片段中实现了seekBar。当我尝试滑动搜索栏时,viewPager会改为更改片段。

在另一篇文章中,用户遇到了类似的问题并提供了一种解决方案,但是该解决方案完全脱离了viewPager中的滑动功能。

在使用搜索栏视图时,如何保持两个滑动功能,但要聚焦搜索栏。

2 个答案:

答案 0 :(得分:0)

我终于找到答案了。如果有人仍然坚持这个问题。 创建SwipeRefreshlayout的自定义类,然后添加到布局中。

    public class CustomSwipeRefresh extends SwipeRefreshLayout {
    private int mTouchSlop;
    private float mPrevX;
    private boolean isDisabled;

    public CustomSwipeRefresh(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public void disableInterceptTouchEvent(boolean isDisabled) {
        this.isDisabled = isDisabled;
        getParent().requestDisallowInterceptTouchEvent(isDisabled);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPrevX = MotionEvent.obtain(event).getX();
                break;
            case MotionEvent.ACTION_MOVE:
                if (isDisabled) {
                    return false;
                }
                float eventX = event.getX();
                float xDiff = Math.abs(eventX - mPrevX);
                if (xDiff > mTouchSlop) {
                    return false;
                }
        }
        return super.onInterceptTouchEvent(event);
    }
}

然后在带有seekbar的片段类上,只需添加代码

mswiperefresh.disableInterceptTouchEvent(boolean);

启用和禁用划动焦点。

 @Override
public void onStartTrackingTouch(SeekBar seekBar) {
     mswiperefresh.disableInterceptTouchEvent(true);
      }

 @Override
     public void onStopTrackingTouch(SeekBar seekBar) {
          mswiperefresh.disableInterceptTouchEvent(false);
    }

答案 1 :(得分:-1)

我终于找到答案了。如果有人仍然坚持这个问题。 创建一个自定义类

    public class CustomSwipeRefresh extends SwipeRefreshLayout {
    private int mTouchSlop;
    private float mPrevX;
    private boolean isDisabled;

    public CustomSwipeRefresh(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public void disableInterceptTouchEvent(boolean isDisabled) {
        this.isDisabled = isDisabled;
        getParent().requestDisallowInterceptTouchEvent(isDisabled);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPrevX = MotionEvent.obtain(event).getX();
                break;
            case MotionEvent.ACTION_MOVE:
                if (isDisabled) {
                    return false;
                }
                float eventX = event.getX();
                float xDiff = Math.abs(eventX - mPrevX);
                if (xDiff > mTouchSlop) {
                    return false;
                }
        }
        return super.onInterceptTouchEvent(event);
    }
}

然后在带有seekbar的片段类上,只需添加代码

refresh.disableInterceptTouchEvent(boolean);

启用和禁用划动焦点。

 @Override
public void onStartTrackingTouch(SeekBar seekBar) {
     mswiperefresh.disableInterceptTouchEvent(true);
      }

 @Override
     public void onStopTrackingTouch(SeekBar seekBar) {
          mswiperefresh.disableInterceptTouchEvent(false);
    }