1

Я новичок в андроиде, и я хочу понять, как лучше всего писать чистый код.
У меня есть следующий пример:Стандартный подход для передачи данных между цепочкой фрагментов

ActivityA ---> FragmentA (main UI window the user sees) 

затем на действия пользователя

FragmentA --->starts---> ActivityB-->FragmentB (the next window the user sees and hides previous one) 

затем на пользователя мыши:

FragmentB---> starts ---> ActivityC-->FragmentC (the next window the user see that hides the rest) 

Таким образом, на последнем шаге пользователь видит расположение of FramentC.

FragmentC Чтобы правильно заполнить виджеты макета, мне нужны некоторые данные, доступные в FragmentA.

Что я теперь делаю:
Проведите данные как дополнительные услуги с намерением до FragmentB. Некоторые из них на самом деле нужны FragmentB, а другие нет, и их пересылают в FragmentB, чтобы впоследствии они были переданы в FragmentC через FragmentB (опять же по намерению/дополнительно), если пользователь на самом деле нажимает кнопку, которая открывается FragmentC.

Вопрос:
1) это работает, но мне было интересно, если то, что я прохожу в статистов о намерении FragmentB данных, что это на самом деле не нужно, это неправильно/взломать и есть лучший/стандартное решение

2) При передаче данных между фрагментами эти копии данных или одна копия передается arround? Я не понимаю. Например. в моем примере, если у меня есть действительно большой объект, переданный от FragmentA до FragmentB (ему это не нужно), а затем FragmentB передает его FragmentC (ему нужно). В итоге я занял 3 размера?

ответ

1

1) Намерение - это, вероятно, правильный способ сделать это. Тот факт, что вам нужно передать ненужные данные, звучит так, будто у вас может быть очень плотная связь в ваших фрагментах, которые могут быть плохими для гибкости позже. Поскольку данные (я предполагаю) связаны с этим, имеет смысл абстрагировать его в классе и сделать класс Parcable или Serializable, чтобы уменьшить эту связь.

2) Предполагая, что вы используете разделяемые/сериализуемые, они фактически копируются. Это связано с тем, что намерение не нужно заходить в ваше приложение, поэтому система превратит ваши данные в форму, которая может быть прочитана вторым приложением. (Я не уверен, какой формат он использует, но представьте себе как JSON. Для всех практических целей это может быть и так).

+0

(1) Таким образом, создать класс, который инкапсулирует Params и каждый фрагмент получает от этого класса, что ему нужно? (2) Итак, если я хочу, чтобы одна копия вместо этого уменьшала накладные расходы, это возможно? – Jim

+0

(1) Да. Таким образом, Фрагмент B не должен знать о полях, используемых во Фрагменте C, хотя они прошли через него. (2) Не через намерения. Вы можете сделать это с помощью статики (однопользовательское поведение), но у вас будет возможность потери данных, если Android остановится и перезапустит вас - вам придется это учитывать. –

0

Намерения, безусловно, способ сделать это! И, как сказал другой ответ, поскольку данные копируются, вы хотите хранить как можно меньше минимальных данных в своих намерениях. Как общее личное правило, я разрабатываю свои действия для работы только с 2 ~ 3 различными дополнительными значениями внутри намерений, которые обычно хранят ключ или идентификатор и состояния, а активность приема открывается и инициализирует все, основываясь на тех немногих ключевых значениях.

+0

'активность приема открывается и инициализирует все, основываясь на тех немногих ключевых значениях, откуда вы извлекаете фактические данные с помощью этих ключей? – Jim

+0

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

+0

http://stackoverflow.com/q/6102730/3339429 – JTY

0

Подумайте об этой вещи в вашем решении:

1- обсудить между активностью вам необходимо намерением 2- передать большие данные между активностью/фрагментом: используйте pareceable/seriazable сверток принят в намерении: http://blog.denevell.org/android-parcelable.html

3- передать данные из фрагмента активности вам нужен интерфейс коммуникатора: http://developer.android.com/training/basics/fragments/communicating.html

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