Как заставить кнопку «Назад» перейти к определенному фрагменту при горизонтальной прокрутке? Закрывает приложение прямо сейчас

название в значительной степени объясняет это.

У меня настроена горизонтальная прокрутка, на первом экране есть кнопки для других фрагментов, а также вся система горизонтальной прокрутки. Я бы хотел, чтобы пользователь мог нажать кнопку «Назад» на одном из этих фрагментов и чтобы приложение вернулось на первый экран со всеми кнопками.

Оттуда я хочу, чтобы кнопка «Назад» была AlertDialog, спрашивая пользователя, хотят ли они выйти из приложения. На данный момент это то, что происходит (на всех фрагментах, когда вы нажимаете кнопку «Назад», появляется всплывающее окно AlertDialog, которое я создал).

Я просмотрел транзакции фрагментов и "addToBackStack()", но не знаю, как это реализовать. Я просмотрел руководство разработчика и некоторые вопросы на этом сайте, но получение одной или двух строк кода не помогает в его реализации.

У меня есть FragmentActivity с настроенным FragmentPagerAdapter, и каждый фрагмент имеет свой собственный файл Java. У меня есть 5 фрагментов, которые все вызываются в FragmentActivity и FragmentPagerAdapter.

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

Фрагмент кода, который я нашел по другим вопросам, и в частности по одному, был следующим:

FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();

Это немного трудно продолжать только это, хотя.

Я был бы очень признателен за вашу помощь.

РЕДАКТИРОВАТЬ: мой код удален - не нужен.


comment
Ваш вопрос неоднозначен, главным образом потому, что вы неправильно объясняете, как работает ваш макет. Кроме того, у меня настроена горизонтальная прокрутка , я думаю, вы имеете в виду ViewPager с фрагментами (?!).   -  person user    schedule 28.12.2012
comment
Да, извините, я использую ViewPager с фрагментами в FragmentActivity. Я думаю, что опубликую свой код, дайте мне секунду   -  person RED_    schedule 28.12.2012
comment
@Luksprog: я добавил свой код, надеюсь, он достаточно хорошо отформатирован для чтения.   -  person RED_    schedule 28.12.2012


Ответы (2)


Если вы используете ViewPager из своего вопроса, на который я ответил ранее, и хотите вернуться к первому фрагменту ViewPager, когда пользователь нажимает кнопку BACK, переопределите метод onBackPressed следующим образом:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().findFragmentByTag("outDialog") != null
            && ((DialogFragment) getSupportFragmentManager()
                    .findFragmentByTag("outDialog")).isVisible()) {
        // we have the out dialog visible and the user clicked back so let
        // the
        // normal events happen
        super.onBackPressed();
        return;
    }
    int currentPosition = mViewPager.getCurrentItem();
    if (currentPosition != 0) {
        // if the page the ViewPager shows isn't the first one then move it
        // to the first one
        mViewPager.setCurrentItem(0);
    } else {
        // we are at the first position already and the user wants out, so
        // annoy him with a dialog that asks him once again if he wants out.
        DialogFragment askHim = new DialogFragment();
        askHim.show(getSupportFragmentManager(), "outDialog");
        // in the dialog listener, if the user presses ok, finish the activity
    }
}
person user    schedule 29.12.2012
comment
Спасибо за помощь. В настоящее время я приближаюсь к этому коду, трассировка стека цитирует строку 105, которая является этой строкой: int currentPosition = mViewPager.getCurrentItem(); Я буду продолжать играть с ним и посмотреть, что я придумал. - person RED_; 29.12.2012
comment
@RED_ Это что-то связанное с вашим кодом. Поскольку вы не упомянули, что является исключением, убедитесь, что mViewPager указывает на ваш ViewPager, а не null. - person user; 29.12.2012
comment
Хм, ошибка возникает, когда я нажимаю кнопку «Назад», исключение NullPointerException. Когда я комментирую этот фрагмент кода вокруг строки 105, я не получаю FC, но тогда, очевидно, кнопка «Назад» становится бесполезной. Этот фрагмент кода выглядит совершенно логичным, поэтому я продолжу поиски. Я добавил переменную вверху своего кода, чтобы указать на ViewPager. ViewPager mViewPager; Это относится к моему ViewPager в коде, который я разместил в своем вопросе, поэтому я сомневаюсь, что он будет нулевым. - person RED_; 29.12.2012
comment
@RED_ В вашей активности должно быть поле: private ViewPager mViewpager;, которое вы инициализируете в методе onCreate активности: mViewPager = (ViewPager)findViewById(R.id.mysixpanelpager);. Это то, что у вас есть на данный момент? Если да, то это было бы очень неудобно. - person user; 29.12.2012
comment
непосредственно перед onCreate у меня есть ViewPager mViewPager; Без частного. Однако я только что попробовал это с частным, и он пришел к тому же выводу, к тому же FC. Это единственный дополнительный бит, который я добавил, кроме фактического onBackPressed() - person RED_; 29.12.2012
comment
@RED_ Да, но в вашем коде в методе onCreate у вас есть ViewPager mViewPager = (ViewPager)super.findViewById(R.id.mysixpanelpager); . Обратите внимание, как вы объявляете локальную переменную mViewPager типа ViewPager. Сделай так mViewPager = (ViewPager)super.findViewById(R.id.mysixpanelpager); . Если это не сработает, дважды проверьте свой код, вы где-то обнуляете переменную mViewPager. - person user; 29.12.2012
comment
Как раз собирался отредактировать мой последний комментарий, по сути, просто сделал то, что вы сказали, и теперь часть этого работает. Нажатие кнопки «Назад» возвращает меня к первому фрагменту. Я вижу, где я ошибся. Однако нажатие кнопки «Назад» на первом фрагменте ничего не делает. Я не знаю, на что ссылается outDialog, так как я не пометил ни один из своих фрагментов. - person RED_; 29.12.2012
comment
давайте продолжим это обсуждение в чате - person user; 29.12.2012

вы пытались переопределить Activity.onBackPressed() ? Я использовал addToBackStack(), и он работает хорошо, но я понятия не имею, работает ли он с PagerAdapter. Я думаю, вы можете переопределить Activity.onBackPressed(), и в этом методе вы можете проверить, является ли текущая страница главной страницей или нет, и выполнить любую работу, которую вы хотите сделать.

Вот псевдокод, который я думаю.

public void onBackPressed() {
  if( pager.getCurrentPage() == 0 ) { //I'm not sure this method exists or not. just example. :-)
      //exit code here
  } else {
      // show first page
  }
}
person kingori    schedule 28.12.2012
comment
Интересно, мне кажется что-то подобное, где фрагменты не используются. Спасибо за псевдокод, буду разбираться. - person RED_; 28.12.2012