Фрагменты выключателя, Поддерживая государство

Решенный, чтобы переписать этот вопрос:

У меня есть три фрагмента, называют их B C. У каждого есть представление с некоторыми областями для пользователя, чтобы заполнить. Пользователь должен быть в состоянии использовать меню, чтобы переключиться между различными фрагментами. Если пользователь заполняет outs информацию во фрагменте A и затем переключается на C, заполняет больше информации и затем переключается назад на информация, которой пользователь, напечатанный в A, должен все еще быть там.

Я думаю, что должен использовать FragmentManager так или иначе, но я не могу выяснить правильную комбинацию, добавляет, что/заменяет/прилагает..., которые требуются, чтобы заставлять его проложить себе путь, я хочу.

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

Текущее рабочее решение:

mContent - активный фрагмент и является переменной члена парламента, не занимающего официального поста деятельности.

Если кто-либо видит что-то не так с этим подходом или способом сделать его более эффективным/более прочный, пожалуйста, сообщенный мне!

public void switchContent(String fragmentTag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    if ( fragmentManager.findFragmentByTag( fragmentTag ) != mContent ) {
        if ( !mContent.isDetached() ) {
            transaction.detach( mContent );
        }

        if ( fragmentManager.findFragmentByTag( fragmentTag ) == null ) {
            if ( fragmentTag.equals( "details" ) ) {
                mContent = ScheduleDetailsFragment.newInstance();
            } else if ( fragmentTag.equals( "notes" ) ) {
                mContent = ScheduleNotesFragment.newInstance();
            } else if ( fragmentTag.equals( "exceptions" ) ) {
               //@TODO - Create Exceptions Fragment
            }
        } else {
            mContent = ( SherlockFragment ) fragmentManager.findFragmentByTag( fragmentTag );
        }
        if ( mContent.isDetached() ) {
            transaction.attach( mContent );
        } else if ( !mContent.isAdded() ) {
            transaction.add( R.id.content_frame, mContent, fragmentTag );
        }

        transaction.commit();
    }
    getSlidingMenu().showContent();
}

Спасибо, Натан

2
nl ja de
Ваше государство потеряло с этим методом, используя .detach ()? Ваша точка зрения потеряла, когда вы снова прикрепляетесь? Или это дает правильные результаты?
добавлено автор flobacca, источник
Это дает правильные результаты, просто не уверенные, если это придерживается методов наиболее успешной практики фрагмента / если это может быть сделано лучше.
добавлено автор Nath5, источник

1 ответы

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

Если ваши страницы держатся на некоторую форму государства/сессии, возвращая новое , Фрагмент для каждого навигационного события является очень плохим пользовательским опытом, и также не настолько хороший на использовании памяти.

Я рекомендовал бы иметь ваше скользящее использование меню FragmentManager в вашем основном Деятельность , чтобы поддержать весь ваш Фрагменты , что вы переключаетесь между. Это будет управлять всеми их государствами, и можно восстановить их использующий findFragmentByTag (Признак последовательности) . Необходимо было бы просто гарантировать, что каждый Фрагмент экономит любое государство (ценности/данные, который изменяется после начального создания), что вы добавляете в onSaveInstanceState (Связывают outState) и восстанавливает его в onCreate (Свяжите savedInstanceState) . Я не уверен, как скользящее меню, которое вы используете, в настоящее время управляет этим, таким образом, это может не быть возможно. Надежда это помогает, по крайней мере, получить вас идущий в правильном направлении.

Edit: Updated answer for updated question - Here is how I would switch the Fragments. By using replace, you will completely switch the Fragments, while reusing the already created ones. In order for your Fragments to saved/restore their state, you need to refer to my answer above. If that is unclear, search for some examples of how to save state in Fragments and Activities.

public void switchContent(String fragmentTag) {

   //If our current fragment is null, or the new fragment is different, we need to change our current fragment
    if (mContent == null || !mContent.getTag().equals(fragmentTag)) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

       //Try to find the fragment we are switching to
        Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag);

       //If the new fragment can't be found in the manager, create a new one
        if (fragment == null) {
            if (fragmentTag.equals("details")) {
                mContent = ScheduleDetailsFragment.newInstance();
            }
            else if (fragmentTag.equals("notes")) {
                mContent = ScheduleNotesFragment.newInstance();
            }
            else if (fragmentTag.equals("exceptions")) {
               //@TODO - Create Exceptions Fragment
            }
        }
       //Otherwise, we found our fragment in the manager, so we will reuse it
        else {
            mContent = (SherlockFragment) fragment;
        }

       //Replace our current fragment with the one we are changing to
        transaction.replace(R.id.content_frame, mContent, fragmentTag);
        transaction.commit();

        getSlidingMenu().showContent();
    }
    else {
       //Do nothing since we are already on the fragment being changed to
    }
}
1
добавлено
Если вы don' t используют FragmentManager , чтобы управлять вашим Фрагменты (намек намека), необходимо вручную спасти и восстановить множество Фрагменты в вашем Деятельность . It' s выполнимый, но расточительный начиная с FragmentManager делает это для вас. Просто процесс для onCreate и onSaveInstanceState , экономят все государство, которое вы используете в onSaveInstanceState , и установка/восстанавливать те переменные в onCreate . Большинство взглядов восстанавливает свое государство для вас. В основном вы don' t должен сделать намного больше, чем установка ваши взгляды в onCreate и восстановить любое таможенное государство, которое вы, возможно, добавили.
добавлено автор Steven Byle, источник
Спасибо за ответ. Я изменил свой код так, чтобы у основного вида деятельности было множество различных фрагментов. Но даже при том, что я использую те же самые фрагменты по нему, появляется, они все еще теряют все государственные данные. Если я использую oneSaveInstanceState тогда won' t я должен вручную задержать все ui элементы к тому, чем они были прежде. Нет ли никакой лучший способ сделать это?
добавлено автор Nath5, источник
I' m вполне уверенный вы просто хотите , отделяют , фрагменты от UI здесь не удаляют их из , FragmentManager также как заменяют делает.
добавлено автор Benten, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)