Управление заголовком ActionBar onBackPressed с помощью ViewPager

позвольте мне сначала определить мою проблему:

у меня есть ViewPager с ActionBar, каждая страница пейджера просмотра представляет собой фаргмент, и каждая страница сама имеет свои собственные кнопки для замены текущего фрагмента другим. Например:

мы сначала запускаем приложение и прокручиваем на третью вкладку, здесь мы устанавливаем заголовок с помощью метода viewPager onTabchanged, и нет проблем, на этой странице у нас есть кнопки, и нажатие на них заменит страницу на себя новыми значениями (подумайте о 3-й странице как о главной категория, которая показывает список элементов и кнопок, например, перемещает нас в подкатегории, которые снова являются списком элементов), поэтому, если мы дважды нажмем кнопки +, мы попадем на 3-ю страницу, и каждый раз, когда мы заменяем фрагмент, теперь у нас есть 3 фрагмента в backStack! все, что я хочу, это когда onBackButton Pressed actionBar должен установить правильный заголовок, вот что я пробовал:

        @Override
    public void onBackPressed() {


    int mFragmentCount = this.getSupportFragmentManager().getBackStackEntryCount();


            super.onBackPressed();
                if(mFragmentCount != 0)
                {

                    FragmentManager.BackStackEntry backEntry=getSupportFragmentManager().getBackStackEntryAt(mFragmentCount-1);
                    String str=backEntry.getName(); //the tag of the fragment
                    mActionBar.setTitle(str);
                }
        }

но каждый раз, когда я получаю ошибку ArrayOutOfIndex, например, недопустимый индекс 2 равен 2!

кто-нибудь может мне помочь в этом?

спасибо!


person Mahdi Giveie    schedule 14.01.2015    source источник
comment
Что у вас есть в Fragment.onResume() методах? Вот где вы должны установить заголовок IMO.   -  person shkschneider    schedule 14.01.2015
comment
@shkschneider хорошо, но проблема в том, что я углубляюсь, например, в 6 фрагментов! как управлять заголовком при нажатии назад?   -  person Mahdi Giveie    schedule 14.01.2015
comment
Попробуйте позвонить mActionBar.setTitle() до super.OnBackPressed().   -  person Ravi K Thapliyal    schedule 14.01.2015
comment
Я думаю, вы получаете ArrayOutOfBoundsException, потому что вы получаете fragmentCount, а затем вызываете super.onBackPressed(). Это, вероятно, вытолкнет запись из заднего стека, в результате чего ваш mFragmentCount выйдет за пределы   -  person 0xDEADC0DE    schedule 14.01.2015
comment
@RaviThapliyal спасибо! Оно работало завораживающе!   -  person Mahdi Giveie    schedule 14.01.2015
comment
@ 0xDEADC0DE и вам спасибо! у меня проблема!   -  person Mahdi Giveie    schedule 14.01.2015
comment
@MahdiGiveie Рад быть полезным :)   -  person Ravi K Thapliyal    schedule 14.01.2015


Ответы (2)


Проблема в том, что когда вы получаете значение mFragmentCount, у вас есть фрагменты x в стеке, но после super.onBackPressed() у вас есть фрагменты x-1, поэтому фрагмент в местоположении x-1 в массиве не существует.

person Sir Codesalot    schedule 14.01.2015

Вы можете попробовать это:

@Override
public void onBackPressed() {
    int count = getFragmentManager().getBackStackEntryCount();
    if (count < 2) {
        super.onBackPressed();
    } else {
        FragmentManager.BackStackEntry backStackEntry = getFragmentManager().getBackStackEntryAt(count - 2);
        mActionBar(backStackEntry.getName());
        getFragmentManager().popBackStack();
    }
}
person agob    schedule 13.03.2015