2013-12-18 6 views
4

Во-первых, я бы сказал, что я искал решение этой проблемы в течение трех дней, это может означать, что я не задаю правильный вопрос или не использую хороший подход. Если есть, пожалуйста, направляйте меня в правильном направлении.Служба Android> Деятельность> Фрагмент с ViewPager

Это сценарий: у меня есть Activity и связанный Service. Service содержит некоторые данные и обрабатывает их по мере необходимости, отправляя постоянное (текущее) уведомление с некоторой информацией. Activity имеет три Fragments внутри ViewPager, который отображает данные, обработанные Service.

The Fragments является Список Фрагмента, который показывает активные записи данных имеются, деталь Фрагмент, который отображает данные для каждого типа данных и Параметров фрагмента в котором пользователь может изменять как обрабатываются данные.

[Service] < -> ([активность] -> [ViewPager ([Список], [Подробности], [Параметры])])

Все работает просто отлично. Мой Activity связывается с Service, создаётся после ViewPager, а затем Fragments извлекает информацию через Interface.

Здесь идет интересная часть ... Вращение экрана!

Как Service не связывает асинхронно, когда пользователь поворачивает Экран Fragments больше нет данных, потому что Activity является ограничивающей службы, пока они присутствуют и не воссозданные благодаря ViewPager.

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

Я бы использовал android:configChanges в своем манифесте, но для каждой ориентации есть разные макеты.

Опять же, если я использую плохой подход, пожалуйста, направляйте меня!

+1

Вы можете попробовать использовать фрагмент без головы, чтобы хранить данные и привязывать ваш сервис. [Здесь] (http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html) - хороший учебник. В нем говорится об использовании безгласного фрагмента с асинхронной задачей, но то же самое можно применить и к вашему делу. Это рекомендуемый способ обработки вращения экрана. – Naveed

+0

Только что сделал, как и предложил @ Kuffs, и он работает безупречно! Не могу поблагодарить вас, ребята! :) –

+0

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

ответ

2

Трудно предположить, когда я не знаю свой код, но мысли вслух ....

Вы можете иметь «фрагмент» работник, который никогда не отображается (т.е. без головы) и имеет setRetainInstance (истина), набор поэтому он не теряет состояние, которое вы установили.

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

Если вам нужно связаться со своей деятельностью, вы можете сделать это с помощью обратных вызовов.

Ваши другие фрагменты могут взаимодействовать с работником вместо Activity.

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

+0

Это замечательно! Спасибо огромное! Хотел бы я подумать об этом несколько дней назад. –

+0

Просто попробовал этот подход, и он работает как шарм! Еще раз спасибо! :) –

0

Во время процесса вращения экрана активность полностью разрушена и использование андроида: congfigChange не рекомендуется. но что вы можете сделать, вы можете переопределить метод saveInstanceState (bundle), в котором вы можете сохранить данные, присутствующие в вашей активности, в момент его уничтожения системой в ответ на поворот экрана. а затем получать его, когда система передает пакет в действие onCreate (bundle) или получает его из метода restoreInstanceState (Bundle).

Смежные вопросы