Как я могу поддерживать состояние дочернего представления при переключении фрагментов?

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

Вот мой код:

public class SomeFragment extends Fragment {
    private SomeCustomView customView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.some_fragment, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Create the child view
        customView = (SomeCustomView) getView().findViewById(R.id.some_fragment_child_view);
        customView.initializeMyCustomView();
    }
}

Как видите, мой фрагмент имеет дочерний вид. Дочерний вид является настраиваемым. Вот код:

public class SomeCustomView extends SurfaceView implements SurfaceHolder.Callback {

    private boolean aVariableWhichMustPersistForLifetimeOfApplication;

}

Всякий раз, когда этот фрагмент добавляется в задний стек, а затем восстанавливается, переменная customView создается заново, и поэтому я теряю значение aVariableWhichMustPersistForLifetimeOfApplication. Это создает мне всевозможные проблемы.

Приложение запустилось с использованием Activity, которое отображало только SomeCustomView и не было никаких фрагментов. Теперь мне нужно добавить функциональность, поэтому я превратил пользовательское представление в фрагмент и, таким образом, пришел к этой проблеме.


person John    schedule 10.07.2014    source источник


Ответы (1)


Я нашел ответ, который работает для меня. Класс FragmentTransaction имеет ряд методов, позволяющих включать/выключать фрагменты. (Документация по Android для FragmentTransaction находится здесь и замечательно< /strong> Объяснение StackOverflow находится здесь. )

В моем случае я хотел, чтобы SomeFragment никогда не терял данные, содержащиеся в его представлении. Для этого используйте этот код:

SomeFragment fragment = new SomeFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.activity_fragment_placeholder, fragment, "some_fragment");
transaction.commit();

а потом позже:

getFragmentManager().beginTransaction().hide(fragment).commit();

Теперь вы можете добавить/прикрепить другой фрагмент к R.id.activity_fragment_placeholder. Обратите внимание, что я использую hide(), а не replace(), это ключевое отличие, которое предотвращает разрушение представления. Если вы хотите вернуть фрагмент, вы можете использовать show() или Android сделает это автоматически, когда пользователь нажмет «Назад», если вы используете addToBackStack() при добавлении/присоединении другого фрагмента.

person John    schedule 10.07.2014