Как получить предыдущий фрагмент при открытии приложения из фона?(приложение, которое не было убито) - PullRequest
1 голос
/ 24 июня 2019

У меня довольно уникальная проблема, когда я пытаюсь получить предыдущий фрагмент, который был там до того, как я перешел на домашний экран через текущий фрагмент (последний видимый фрагмент)

Чтобы больше не путать, вот шаги, чтобы воспроизвести мою проблему

1) запустить основное действие, оттуда открыть фрагмент A нажатием кнопки (скажем, кнопка A)

2) от фрагмента A, нажмите другую кнопку, скажем, B, которая откроет фрагмент B.

3) Фрагмент B имеет кнопку закрытия и сохранения, нажатие которой возвращает меня к предыдущему фрагменту backstack A (activity.backpressed ())

4) Теперь у меня есть сценарий, в котором я вызываю фрагмент B, нажимая кнопку B. После нажатия кнопки «Сохранить и закрыть», если я сразу же нажимаю кнопку «Домой» и возвращаюсь в фоновый режим и возвращаюсь обратно в приложение, оно перезапускается. приложение запускает mainacctivity повсюду, вместо открытия фрагмента A (который был желаемым фрагментом).

Вот мой код: Это мой общий код для открытия фрагментов:

 public void openFragment(@NonNull Fragment fragment, String tag) {
        Fragment f = getSupportFragmentManager().findFragmentByTag(tag);
        if (f != null) return;
        getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.anim.slide_up, R.anim.slide_bottom, R.anim.slide_up, R.anim.slide_bottom)
                .add(R.id.cl_root_view, fragment, tag)
                .addToBackStack(tag)
                .commit();
    }

При нажатии кнопки B я вызываю ее следующим образом:

openFragment( FragmentB.newinstance(), fragmentB.TAG);

Как только фрагмент B открывается, я обновляю свои данные и нажимаю сохранить и закрыть:

@OnClick(R.id.saveAndClose)
    void onSaveClick() {
        // update the contents 
          closeFragment();

    }

    protected void closeFragment() {
        Activity activity = getActivity();
        hideKeyboard();
        if (activity != null) {
            activity.onBackPressed();
        }
    }

Как вы можете видеть, проблема заключается в том, что данные сохраняются, как и ожидалось, но если я нажму кнопку «Домой», прямо перед завершением процесса сохранения и извлечением фрагмента (с помощью возврата), при повторном открытии экрана / или возобновлении, вместо просмотра фрагмента А (который был основным вызывающим фрагментом) приложение перезапускается. (Я знаю, что проблема возникает из-за того, что активность одинакова для всех этих фрагментов и вызывается активность. OnBackPressed (); кажется, что все в стеке разрушено, и после возобновления приложения кажется, что оно вызывает операцию еще раз вместо последний фрагмент в backstack). Есть идеи, как это сделать?

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

1 Ответ

1 голос
/ 26 июня 2019

Я понял это.Вот решение, которое работает для меня:

 fragmentManager = getFragmentManager();
        //check if on orientation change.. do not re-add fragments!
        if(mSavedInstanceState == null) {
            //instantiate the fragment manager
            fragmentTransaction = fragmentManager.beginTransaction();
            Fragment prevFragment = fragmentManager.findFragmentByTag(FragmentB.TAG);
            if (prevFragment != null) {
                fragmentTransaction.remove(prevFragment);
            }
            try {
                fragmentManager.popBackStack();
            }catch (IllegalStateException e){
                e.printStackTrace();
            }
            fragmentTransaction.commitAllowingStateLoss();

Мне удалось открыть фрагмент B, когда мое приложение находилось в фоновом режиме, и, следовательно, достичь фрагмента A, поэтому, когда я вернулся в свое приложение, я смог увидеть фрагмент Aс обновленными значениями, переданными обратно из фрагмента B.

...