Как обрабатывать кнопку «Назад» с помощью пейджера?

У меня есть два фрагмента Frag A и Frag B, которые отображаются с использованием пейджера просмотра. Если пользователь провел пальцем от A к B, а затем нажал кнопку «Назад» (находясь в B), то пользователь должен перейти к A, а не выходить из пейджера. Как мы можем этого добиться?

Добавление транзакции в backstack не помогает.

Спасибо


person Preethi    schedule 01.11.2012    source источник


Ответы (3)


Вы должны переопределить метод onKeyDown() в файле Activity.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        myViewPager.setCurrentItem(0, true);
        return true;
    } else {
       return super.onKeyDown(keyCode, event);
    }
}

Это зафиксирует событие нажатия кнопки "назад" и отправит пользователя к первому элементу в ViewPager.

Существует также ViewPager#getCurrentItem() который можно использовать для возврата, только если пользователь провел пальцем по экрану. Такая реализация:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && myViewPager.getCurrentItem() == 1) {
        myViewPager.setCurrentItem(0, true);
        return true;
    } else {
       return super.onKeyDown(keyCode, event);
    }
}

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

Вам может понадобиться случай, когда пользователь возвращается на предыдущую страницу (при условии, что у вас более двух страниц). В этом случае вы хотите реализовать ViewPager.OnPageChangeListener () и сохранять позицию каждый раз, когда вызывается onPageSelected(int position). Если вы реализуете их в стеке, вы можете выталкивать их каждый раз, когда пользователь нажимает «назад». Когда стек опустеет, выйдите из приложения.

ИЗМЕНИТЬ

Как правильно указано в комментариях Джейд Байфилд, несколько более простым способом сделать это было бы использовать onBackPressed() в Activity. Это будет работать только на уровнях API 5+.

@Override
public void onBackPressed() {
  if(i_dont_want_to_leave) {
     myViewPager.setCurrentItem(0, true);
  } else {
    super.onBackPressed(); // This will pop the Activity from the stack.
  }
}
person DeeV    schedule 01.11.2012
comment
Может ли он также переопределить onBackPressed? Или это только для более ранних API? - person Jade Byfield; 02.11.2012
comment
Использование onKeyDown() работает на каждой платформе уровня API 1+. Кроме того, если я не использовал его неправильно все время, onBackPressed не предотвратит извлечение Activity из стека. Если вы вернете true в onKeyDown(), то это будет единственное, что произойдет, и событие перестанет каскадироваться. - person DeeV; 02.11.2012
comment
Ждать. Только что сделали сброс мозгов. Да. Он может использовать onBackPressed(), если хочет ориентироваться на API 5+. Просто не вызывайте super.onBackPressed(), если вы не уверены, что хотите выйти. - person DeeV; 02.11.2012

На странице документов Android

https://developer.android.com/training/animation/screen-slide.html#viewpager

Я нашел пример обработки ViewPager скольжения, и есть метод

@Override
public void onBackPressed() {
  if (mPager.getCurrentItem() == 0) {
    super.onBackPressed();
  }
  else {
    mPager.setCurrentItem(mPager.getCurrentItem() - 1);
  }
}

Это выбирает предыдущую страницу или выходит из текущего действия.

person mortalis    schedule 17.01.2018

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

public abstract class BackKeyHandlingFragment extends Fragment {
    public abstract boolean handleBackKey();
}

Activity может делегировать обработку backKey текущему фрагменту. Фрагменты могут выполнять необходимые действия в соответствующей реализации метода handleBackKey. Метод может возвращать значение true, чтобы указать активности не обрабатывать ключ возврата. Чтобы продолжить действие клавиши возврата по умолчанию на уровне действия, метод может возвращать значение false.

public void onBackPressed() {
     BackKeyHandlingFragment fragment = (BackKeyHandlingFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem());
     // Fragment should return boolean according to app requirements after processing back key
     if (!fragment.handleBackKey()) { 
        super.onBackPressed();
    }
}
person DevadasTV    schedule 26.07.2016