Проблемы жизненного цикла фрагмента BackStack - PullRequest
0 голосов
/ 11 октября 2019

У меня есть фрагмент активности, который имеет фрагмент A. Фрагмент A делает некоторые важные вещи в методе onViewCreated:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mission1 = view.findViewById(R.id.mission1);
    mission2 = view.findViewById(R.id.mission2);
    mission3a = view.findViewById(R.id.mission3a);
    mission3b = view.findViewById(R.id.mission3b);

    imageButtonList.add(mission1);
    imageButtonList.add(mission2);
    imageButtonList.add(mission3a);
    imageButtonList.add(mission3b);
    prepareButtons();
}

ОК, теперь этот фрагмент A имеет кнопку, которая создаетновый фрагмент B, но я хочу добавить кнопку «назад» в новый фрагмент B, поэтому я добавил фрагмент A в backstack при запуске фрагмента B:

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
CampaignMissionFragment fragment = CampaignMissionFragment.newInstance(auxMission);
ft.replace(R.id.fragmentContainer, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();

А во фрагменте B я добавил это вкнопка возврата onClick ():

getFragmentManager().popBackStack();

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

Как правильно решить эту проблему? Я думал, что Fragment имеет поведение, подобное действиям, где вы можете решить эту проблему, поместив код, который вы не хотите выполнять два раза, в onCreate. Но в этом случае я не могу этого сделать, потому что мои представления недоступны в методе onCreate фрагмента.

Спасибо

Ответы [ 3 ]

0 голосов
/ 12 октября 2019

Обновление onBackПодписки вашей активности фрагмента как -

 @Override
    public void onBackPressed() {
        FragmentManager fm = getFragmentManager();
        if (fm.getBackStackEntryCount() > 0) {
            fm.popBackStack();
        } else {
            super.onBackPressed();
        }
    }
0 голосов
/ 14 октября 2019

Попробуйте написать код в OneResume

 @Override
public void onResume() {
    mission1 = view.findViewById(R.id.mission1);
    mission2 = view.findViewById(R.id.mission2);
    mission3a = view.findViewById(R.id.mission3a);
    mission3b = view.findViewById(R.id.mission3b);

    imageButtonList.add(mission1);
    imageButtonList.add(mission2);
    imageButtonList.add(mission3a);
    imageButtonList.add(mission3b);
    prepareButtons();
}
0 голосов
/ 12 октября 2019

Вы можете попытаться очистить imageButtonList в onDestroyView. Другое решение состоит в том, чтобы проверить, не является ли saveInstanceState не равным нулю, и затем избегать добавления кнопки в список, если это так. Также нет операции, связанной с просмотром в onCreate ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...