Як вимкнути або ввімкнути перегляд сторінки перегляду в android


78

Що я намагаюся зробити: Я намагаюсь увімкнути / вимкнути проведення пальцем по пейджеру, коли програма запускається

Приклад: Коли в потоці, якщо я перевіряю стан і якщо він повертається,trueувімкніть проведення, а якщо повернеться -falseвимкніть проведення.


Рішення, яке я використовую, це одне

public class CustomViewPager extends ViewPager {

private boolean enabled;

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

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

Потім виберіть це замість вбудованого переглядача у XML

<mypackage.CustomViewPager 
android:id="@+id/myViewPager" 
android:layout_height="match_parent" 
android:layout_width="match_parent" />

Вам просто потрібно викликати метод "setPagingEnabled" із значенням "false", і користувачі не зможуть провести пальцем, щоб зробити сторінку.


Проблема з вищезазначеною методологією: я не можу встановити властивість для потоку, I: e .... Я або можу дозволити проведення, або відключити проведення. Але я не можу зробити це за умови


Питання:

  1. Чи можу я досягти своєї мети якимось іншим способом, якщо так, то що це?
  2. Або це неможливо?


Чи не можна було б встановити властивість для потоку за допомогою DataBinding?
старшийгод

Спробуйте використати stackoverflow.com/a/42687397/4559365
Pradeep Kumar Kushwaha

Відповіді:


62

Вимкніть програмове проведення пальцем по -

    final View touchView = findViewById(R.id.Pager); 
    touchView.setOnTouchListener(new View.OnTouchListener() 
    {         
        @Override
        public boolean onTouch(View v, MotionEvent event)
        { 
           return true; 
        }
     });

і використовуйте це, щоб провести пальцем вручну

touchView.setCurrentItem(int index);

55
Це все ще дозволяє частково провести пальцем по панелі перегляду (наприклад, 1%), перш ніж зупиниться. Це виглядає потворно.
Ігор Ганапольський

8
Його рішення працює, воно просто неповне. Вам слід також замінити onInterceptTouchEvent (подія MotionEvent). Це надасть вам бажаного вигляду без 1%
портфелів

2
Неможливо перевизначити цей метод
Анімеш Мангла

він працює, але коли його ввімкнено, проведіть пальцем дуже погано і повільно
фаз сагафі

5
це абсолютно неправильне рішення, чому так багато зірок. Це справді виглядає потворно, з пальцем 1%. Ймовірно, нам слід розширити переглядач сторінок і перевизначити InterInterTouchEvent
Антон Кізема

75

Найкраще рішення для мене. -Спершу ви створюєте такий клас:

public class CustomViewPager extends ViewPager {
  private Boolean disable = false;
  public CustomViewPager(Context context) {
      super(context);
  }
  public CustomViewPager(Context context, AttributeSet attrs){
      super(context,attrs);
  }
  @Override
  public boolean onInterceptTouchEvent(MotionEvent event) {
     return !disable && super.onInterceptTouchEvent(event);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
     return !disable && super.onTouchEvent(event);
  }

  public void disableScroll(Boolean disable){
      //When disable = true not work the scroll and when disble = false work the scroll
      this.disable = disable;
  }
}

-Тоді змініть це у своєму макеті: <android.support.v4.view.ViewPager для цього<com.mypackage.CustomViewPager

-Нарешті, ви можете його відключити: view_pager.disableScroll(true); або включити:view_pager.disableScroll(false);

Я сподіваюся, що це вам допоможе :)


Подяка Альберто :)
Praveen Kumar Verma

1
Також не забудьте викликати метод viewPager.invalidate () після виклику методу відключення прокрутки, через що він миттєво вимикає проведення.
Ritesh Adulkar

З цим рішенням подання всередині ViewPager не отримуватимуть жодного введення if disable == true. Перевизначення onInterceptTouchEvent()не є правильним рішенням.
Олексій Семенюк

замість Boolean я б скоріше використав тут boolean.
hgoebl

Дякую. Ваша відповідь допомогла мені покращити робочу функцію.
AndyN

19

У своєму користувацькому адаптері перегляду пейджера перевизначте ці методи в ViewPager.

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    // Never allow swiping to switch between pages
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // Never allow swiping to switch between pages
    return false;
}

А щоб увімкнути, просто поверніть кожен superметод:

super.onInterceptTouchEvent(event)і super.onTouchEvent(event).


4

За відключення проведення

mViewPager.beginFakeDrag();

Для включення проведення пальцем

if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();



Чи можете ви уточнити ваш запит?
Санджай Бхалані,

Я намагаюся використовувати це рішення, але воно викличе NullPointerException при виклику endFakeDrag.
Mia

спробуйте використати такий стан, як. якщо (mViewPager.isFakeDragging ()) mViewPager.endFakeDrag ();
Санджай Бхалані,

3

У моєму випадку спрощене рішення працювало нормально. Метод заміни повинен бути у вашому користувацькому адаптері переглядача сторінок, щоб замінити слухачі TouchEvent і зробити так, щоб їх заморозити;

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

}

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

}

надати пояснення щодо запропонованого рішення
Anantha Raju C

1
@AnanthaRajuC надав :)
Ерік

Завдяки цьому рішенню перегляди всередині ViewPager не отримуватимуть жодного введення, якщо this.enabled == false. Перевизначення onInterceptTouchEvent()не є правильним рішенням.
Олексій Семенюк

2

Я знайшов інше рішення, яке працювало для мене, перейдіть за цим посиланням

https://stackoverflow.com/a/42687397/4559365

В основному це перевизначає метод canScrollHorizontallyвідключення проведення пальцем. Як-небудь setCurrentItemвсе-таки працює.


canScrollHorizontally()Метод не має ніякого ефекту в поточному сценарії. Він навіть не викликається, коли трапляється пальцем.
Олексій Семенюк

1

Це спрацювало для мене.

   ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            // disable swipe
            if(!swipeEnabled) {
                if (viewPager.getAdapter().getCount()>1) {
                    viewPager.setCurrentItem(1);
                    viewPager.setCurrentItem(0);
                }
            }
        }
        public void onPageScrollStateChanged(int state) {}
        public void onPageSelected(int position) {}
    };
    viewPager.addOnPageChangeListener(onPageChangeListener);

1

Якщо ви хочете розширити його лише тому, що вам потрібна поведінка, що не дозволяє гортати, вам не потрібно це робити. ViewPager2 надає приємне властивість під назвою:isUserInputEnabled

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.