Android Studio onTouchListener не работает на Viewpager - PullRequest
0 голосов
/ 17 января 2020

мой сенсорный прослушиватель не работает. Я пытаюсь поместить его в окно просмотра, чтобы подсчитать в основном все касания, которые делает пользователь.

в моем методе onCreate:

   mViewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        Log.d("TOUCH ON TAB", "TOUCH DETECTED");

                        if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
                            touchCounter++;
                        }

                        if(touchCounter >= 5) {
                            // you have done 5 touches
                            ShowCounter();
                            touchCounter = 0;
                        }
                        break;
                }
                return true;
            }
        });

Но Log.d("TOUCH ON TAB", "TOUCH DETECTED"); не найдено в консоли. Также мой счетчик не работает.

Viewpager выглядит так:


   <android.support.v4.view.ViewPager
                    android:id="@+id/container"
                    android:clickable="true"
                    android:focusable="true"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_above="@+id/adView"
                    android:layout_marginBottom="2dp">
                </android.support.v4.view.ViewPager>

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Вам нужно создать свой собственный класс, который расширяет ViewPager:

public class ViewPagerExample extends ViewPager {

private boolean enabled;
private ViewPagerAdapter adapter;

public ViewPagerExample(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.enabled = true;
    changePagerScroller();
}

@Override
public void setAdapter(@Nullable PagerAdapter adapter) {
    super.setAdapter(adapter);
    this.adapter = (ViewPagerAdapter) adapter;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onTouchEvent(event);
    }

    return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onInterceptTouchEvent(event);
    }

    return false;
}


public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
}


private void changePagerScroller() {
    try {
        Field mScroller = null;
        mScroller = ViewPager.class.getDeclaredField("mScroller");
        mScroller.setAccessible(true);
        ViewPagerScroller scroller = new ViewPagerScroller(this.getContext());
        mScroller.set(this, scroller);
    } catch (Exception e) {
        Log.e(this.getClass().getSimpleName(), "error of change scroller ", e);
    }
}

private class ViewPagerScroller extends Scroller {

    private int mScrollDuration = 1000;

    ViewPagerScroller(Context context) {
        super(context);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, mScrollDuration);
    }
    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        super.startScroll(startX, startY, dx, dy, mScrollDuration);
    }


}

}

0 голосов
/ 18 января 2020

Скорее всего, ваша проблема не в OnTouchListener, я столкнулся с проблемами при использовании пробелов в теге журнала при попытке записи сообщений; они не будут сообщать вам об ошибках или предупреждениях, и если вы не отфильтруете результаты в logcat и не увидите все сообщения отладки, на самом деле вы их там найдете; но по какой-то причине они не могут быть отфильтрованы правильно, используя фильтрацию logcat.

Поэтому попробуйте изменить ниже log

Log.d("TOUCH ON TAB", "TOUCH DETECTED");

На что-то без пробелов или специальных символов

Log.d("TOUCH_ON_TAB", "TOUCH DETECTED");

надеюсь, это поможет

...