Как восстановить ранее отображенный фрагмент? - PullRequest
10 голосов
/ 08 декабря 2011

Я использую пакет совместимости v4 в своем проекте, и у меня возникла проблема с сохранением Fragment после его удаления из поля зрения. У меня Activity отображаются 2 фрагмента ... рамка меню слева, панель контента справа. Кадр меню имеет 3 различных меню (фрагмента), которые могут отображаться.

Вот как я заменяю Фрагмент меню:

public void showMenuFragment( Fragment fragment, String tag ) {

        showFragment( R.id.menu_frame, fragment, tag, false);
        setLastMenuPushed( tag );
    }

protected void showFragment( int resId, Fragment fragment, String tag, boolean addToBackStack ) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        if ( fragmentManager.findFragmentByTag( tag ) != null && fragment.isAdded() ) {
            transaction.remove( fragment );
        }

        transaction.replace( resId, fragment, tag ).setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN ).setBreadCrumbShortTitle( tag );

        if ( addToBackStack ) {
            transaction.addToBackStack( tag );
        }

        transaction.commit();
    }

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

Когда я звоню showMenuFragment(...), я пытаюсь передать Fragment, используя FragmentManager.findFragmentByTag(String tag), но это всегда null, поэтому мне приходится делать новый Fragment каждый раз, когда я хочу показать другое меню.

Мой вопрос: как мне сохранить эти Fragment после того, как они будут заменены другими меню? Я хочу не сохранять ручные ссылки на Fragment s, поскольку при повороте устройства экземпляр моего класса Activity уничтожается, и я теряю эти ссылки.

EDIT: проще говоря, я хочу, чтобы FragmentManager отслеживал предыдущие Fragment s, не добавляя их в задний стек. Я не хочу нажимать кнопку «Назад» и видеть предыдущее меню.

Ответы [ 2 ]

14 голосов
/ 09 декабря 2011

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

public void showMenuFragment( Fragment fragment, String tag, boolean addToBackStack ) {

        showFragment( R.id.menu_frame, fragment, tag, getLastMenuPushed(), addToBackStack );
        setLastMenuPushed( tag );
}

protected void showFragment( int resId, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        if ( lastTag != null ) {
            Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
            if ( lastFragment != null ) {
                transaction.hide( lastFragment );
            }
        }

        if ( fragment.isAdded() ) {
            transaction.show( fragment );
        }
        else {
            transaction.add( resId, fragment, tag ).setBreadCrumbShortTitle( tag );
        }

        if ( addToBackStack ) {
            transaction.addToBackStack( tag );
        }

        transaction.commit();
}
0 голосов
/ 08 декабря 2011

Я не уверен, возможно ли это.FragmentManager заботится ТОЛЬКО о Fragments на своем BackStack.Но вы можете обойти проблему, вызванную нажатием кнопки «назад», если вы разрешите вашему FragmentActivity реализовать onBackButtonPressed и разрешите настраиваемое поведение.Вы можете делегировать их на ваш Fragments или просто показать другой Fragment в зависимости от вашей логики приложения

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