Android backstack ведет себя странно

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

Я перезаписываю onBackPressed() в моей основной деятельности...

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    if (fragmentManager.getBackStackEntryCount() > 1) {
        fragmentManager.popBackStackImmediate();
    } else if(fragmentManager.findFragmentByTag("Seizure Tracker").isVisible()) {
        if (backButtonPressed + 3000 > System.currentTimeMillis())
            super.onBackPressed();
        else {
            backButtonPressed = System.currentTimeMillis();
            Toast.makeText(this, "Press back again to exit.", Toast.LENGTH_SHORT).show();
        }
    } else{
        super.onBackPressed();
    }
}

Кажется, это работает нормально, за исключением одного перехода. В основном я двигаюсь от фрагмента A -> B -> C, нажимаю назад и фрагмент A обнаруживается. Нажмите еще раз, и вместо сообщения "Нажмите еще раз, чтобы выйти" ничего не происходит. Нажмите еще раз, и появится сообщение.

Если я пойду

 A -> B -> C back (now at A) -> B -> C back

Я оказываюсь в B. Если я снова нажимаю, я остаюсь в B. Нажмите снова, и я добираюсь до A. Нажмите снова, и появляется сообщение "Нажмите еще раз, чтобы выйти".

Если я пойду

A -> B -> C -> D back (now at C) back

Я в конечном итоге в том же состоянии, как если бы я вернулся A -> B -> C. Так что в основном D обратно в C работает нормально, как и любой другой обратный переход.

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

getSupportFragmentManager().addOnBackStackChangedListener(
            new FragmentManager.OnBackStackChangedListener() {
                public void onBackStackChanged() {
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    System.out.println("changed: "+fragmentManager.getBackStackEntryCount());
                    for(int i = 0; i < fragmentManager.getBackStackEntryCount(); i++)
                        System.out.println("name: "+fragmentManager.getBackStackEntryAt(i).getName());

                    // Update your UI here.
                    getSupportActionBar().setTitle(getSupportFragmentManager()
                            .findFragmentById(R.id.container).getTag());
                }
            });

Это обновляет actionBar, как если бы задние переходы работали как задумано. Я также добавил строки для печати, и они говорят мне, что обратные переходы работают как задумано, и я не вижу ничего странного в печати:

for(int i = 0; i < fragmentManager.getBackStackEntryCount(); i++)
     System.out.println("name:"+fragmentManager.getBackStackEntryAt(i).getName());

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

switch (position) {
            case 0:
                fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                System.out.println(fragmentManager.getBackStackEntryCount());
                fragmentManager.beginTransaction()
                        .add(R.id.container, new SeizureTrackerFragment(), "Seizure Tracker")
                        .commit();
                break;
            case 2:
                fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                fragmentManager.beginTransaction()
                        .add(R.id.container, new SetupFragment(), "Setup")
                        .commit();
                break;
            case 3:
                fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                fragmentManager.beginTransaction()
                        .add(R.id.container, new AboutFragment(), "About")
                        .commit();
                break;
        }

Если я начну с любого из других фрагментов, кроме "случая 0", все работает нормально.

Я всегда перехожу, используя один и тот же код:

fragmentManager.beginTransaction()
                    .add(R.id.container, new AnalyzeFragment(), "Analyze")
                    .addToBackStack("Analyze").commit();

Мой фрагмент onCreate() все выглядит одинаково:

    View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    AppCompatActivity activity = (AppCompatActivity) getActivity();
    ActionBar actionBar = activity.getSupportActionBar();
    actionBar.setTitle("Analyze");
    if(view == null)
        view = inflater.inflate(R.layout.fragment_analyze, container, false);
    return view;
}

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

0 ответов

Другие вопросы по тегам