2

У меня есть ViewPager, содержащий числа фрагмента.Android: поиск в SwipeRefreshLayout внутри Viewpager

В каждом фрагменте есть SwipeRefreshLayout, который содержится в строке поиска.

Однако большой палец хода не перемещается плавно (по горизонтали).

Палец всегда перемещает некоторый процент хода стрелки поиска и автоматически отпускает, даже я до сих пор касаюсь большого пальца.

Кто-нибудь сталкивался с таким же случаем?

Как это можно исправить?

ответ

0

Вы можете расширить SwipeRefreshLayout, а затем переопределить метод onInterceptTouchEvent.

 

    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); 
    } 

0

Ответ @robxyy правильный, но мне потребовалось время, чтобы выяснить, какие части реализации. Следовательно, для разработки его ответа. См. Ниже код:

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

    public CustomSwipeRefreshLayout(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); 
    } 
} 

Над классом распространяется макет обновления салфетки. Теперь нам нужно вызвать

disableInterceptTouchEvent(true) 

, когда мы начинаем SeekBar Swiping и мы должны вызвать

disableInterceptTouchEvent(false) 

Когда SeekBar ударяя стоп. Следовательно, пользовательский класс Seekbar выглядит следующим образом:

public class SwipeView extends RelativeLayout implements SeekBar.OnSeekBarChangeListener { 
    private CustomSwipeRefreshLayout swipeRefreshLayout; 

    public SwipePromotionView(CustomSwipeRefreshLayout swipeRefreshLayout) { 
     this.swipeRefreshLayout = swipeRefreshLayout; 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
      // include some logic here to decide which part of the swipe bar is a valid starting point 
     swipeRefreshLayout.disableInterceptTouchEvent(true); 
    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     swipeRefreshLayout.disableInterceptTouchEvent(false); 
    } 
} 
Смежные вопросы