Подтвердить что ты не робот

Что такое логика дизайна для фрагментов как статические внутренние классы и автономные публичные классы?

Я не могу понять один важный аспект разработки программного обеспечения Android, с которого я только начинаю, из того, что я знаю, был разработан дизайн Fragment, чтобы развязать код, где интуиция заключается в том, что Activity остается как есть, а Fragment может быть повторно использовано иначе, где, возможно, даже в другой деятельности или, возможно, вдоль других фрагментов, в чем-то вроде потока Master/Detail или ландшафтного интерфейса.

Хорошо, поэтому я видел довольно много вопросов о SO, спрашивающих, почему Fragments помещаются как статические внутренние классы внутри Activity, и ответ заключается в том, что если мы не сделаем их статичными, Fragment может содержать ссылку на активность и что-то вроде поворота экрана, или повторная ничья может привести к утечке активности или чего-то еще.

Это возвращает меня к квадрату, и у меня возникает вопрос, что, если проект Fragment был принят для того, чтобы отделить код, то почему мы выходим замуж за Fragment за Activity, помещая его внутри класса активности и не ставить их как самостоятельные публичные классы? Разве это не противоречит самому существованию Фрагментов?

Какова нижняя сторона структуры проекта как таковой? Где каждый Fragment является отдельным классом? Учитывая, что мой код фрагмента может вырасти до 1000 строк, особенно при попытке сделать анимацию, я вижу, что это намного более аккуратно, развязано и многократно используется в других действиях, кроме предполагаемой родительской активности.

  • Неужели мы все еще страдаем от проблемы утечки памяти, упомянутой выше?
  • Мне что-то не хватает в логике дизайна? Пожалуйста, просветите меня.
  • Есть ли способ, когда фрагменты остаются внутренним классом и все еще используются в другом месте? Возможно, мне тоже что-то не хватает... так что сообщите мне.

Project structure

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

Спасибо:)

4b9b3361

Ответ 1

Это возвращает меня к квадрату, и у меня возникает вопрос, что, если дизайн фрагмента был принят для того, чтобы развязать код, то почему мы выходим замуж за Фрагмент за активность, помещая его в класс активности и не ставить их как самостоятельные публичные классы? Разве это не противоречит самому существованию Фрагментов?

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

Прочитайте о философии дизайна фрагментов.

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

Один из распространенных способов сохранить фрагменты в отдельных классах, но близко к связанным с ними действиям, и, таким образом, использовать префикс именования, чтобы они сортировались в алфавитном порядке в одном и том же пакете: например, FooActivity с FooDetailsFragment.

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

Просто старайтесь быть последовательным, чтобы другие люди, читающие код, могли легко найти свой путь в кодовой базе, а метрика WTF/минута кода была низкой.

Мы по-прежнему страдаем от проблемы утечки памяти, упомянутой выше?

Нет, утечка распространяется только на нестатические внутренние классы, содержащие ссылку на внешний класс. Классы уровня пакета не имеют никакого внешнего класса для ссылки.

Поскольку фрагменты используют жизненный цикл хостинговой активности, утечка внешнего объекта на самом деле не является проблемой фрагментов. Это просто, что структура должна иметь возможность создавать экземпляры без каких-либо внешних объектов класса, а для этого требуется static.

Есть ли способ, когда Фрагменты остаются внутренним классом и все еще используются в другом месте? Возможно, мне тоже что-то не хватает... так что сообщите мне.

Вы можете ссылаться на общедоступные внутренние классы с точечной нотации Outer.Inner в коде или Outer$Inner с отражением (например, файлы XML).

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

Ответ 2

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

Итак, я проверяю http://developer.android.com/guide/components/fragments.html который всегда стоит перечитывать, и, как известно, пример внизу - это то, что вы предлагаете, и я использую каждый день: два открытых фрагмента в автономных классах, которые привязаны к действию. >

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

gl hf!