Сколько действий против фрагментов?

Введение:

В базовом шаблоне "Fragments Tutorial" есть что-то вроде этого:

  • На планшете, у вас есть список слева, подробности справа.
  • Оба являются Fragments и оба находятся в одном и том же Activity.
  • На телефоне, list Fragment в одном Activity.
  • Запустите новый Activity с информацией Fragment.

(например, Android Fragments API от Dianne Hackborn и API фрагментов Руководство)

На обоих устройствах функциональность находится в Fragments. (Простой)

На Tablet все приложение 1 Activity, на телефоне, есть many Activities.


Вопросы:

  • Есть ли причина разделить телефонное приложение на многие Activities?

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

  • Не было бы проще сохранить 1 модель действия в обоих случаях, используя ту же логику переключения Fragments в и из (только с использованием другого макета)?

Таким образом, большая часть логики находится в самой Fragments, и существует только одно Activity - меньшее дублирование кода.

И то, что я прочитал о ActionBarSherlock, состоит в том, что он лучше работает с Fragments вместо Activities (но я еще не работал с ним).

Упрощены ли учебные пособия или я пропустил что-то важное в этом подходе?


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

Некоторые ссылки на связанные вопросы:


Обновление

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

Также была найдена интересная статья парней на площади, которая стоит прочитать:

Ответ 1

Я согласен с тем, что учебники очень упрощены. Они просто вводят Fragments, но я не согласен с шаблоном, как было предложено.

Я также согласен с тем, что не рекомендуется дублировать вашу логику приложений во многих видах деятельности (см. DRY Принцип по википедии).


Я предпочитаю шаблон, используемый в приложении ActionBarSherlock Fragments Demo (скачать здесь и исходный код здесь). Демонстрация, которая наиболее точно соответствует учебнику, упомянутому в вопросе, - это тот, который называется "Макет" в приложении; или FragmentLayoutSupport в исходном коде.

В этой демонстрации логика была перенесена из Activity и в Fragment. TitlesFragment фактически содержит логику изменения фрагментов. Таким образом, каждая операция очень проста. Чтобы дублировать многие очень простые действия, в которых ни одна из логических элементов внутри "Деяний" не делает этого очень простым.

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

    /**
    * Helper function to show the details of a selected item, either by
    * displaying a fragment in-place in the current UI, or starting a
    * whole new activity in which it is displayed.
    */
    void showDetails(int index)
    {
        mCurCheckPosition = index;

        if (mDualPane)
        {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            // Check what fragment is currently shown, replace if needed.
            DetailsFragment details = (DetailsFragment) getFragmentManager()
                .findFragmentById(R.id.details);
            if (details == null || details.getShownIndex() != index)
            {
                // Make new fragment to show this selection.
                details = DetailsFragment.newInstance(index);

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();
                ft.replace(R.id.details, details);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }

        }
        else
        {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Intent intent = new Intent();
            intent.setClass(getActivity(), DetailsActivity.class);
            intent.putExtra("index", index);
            startActivity(intent);
        }
    }

Другим преимуществом шаблона ABS является то, что вы не получаете активность в Tablet Activity, содержащую много логики, а это означает, что вы сохраняете Память. Шаблон учебника может привести к очень большой основной деятельности в более сложном приложении; так как он должен обрабатывать логику всех фрагментов, которые будут помещены в нее в любое время.

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

Ответ 2

Я думаю, ты на правильном пути. (И да, учебники слишком упрощены).

В макете планшета вы можете использовать одно действие и свопировать и выгружать фрагменты (в нескольких "панелях" ). В макете телефона вы можете использовать новую активность для каждого фрагмента.

Так же:

enter image description here

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

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

Итак, если у пользователя есть планшет, вы бы использовали MyMultiPaneFragActivity или что-то подобное. Эта деятельность отвечает за управление обратными вызовами от фрагментов и намерений маршрутизации до правильного фрагмента (например, намерение поиска)

Если у пользователя есть телефон, вы можете использовать обычное действие с очень маленьким кодом и расширять его MyBaseSingleFragActivity или что-то подобное. Эти действия могут быть очень простыми, 5-10 строк кода (возможно, даже меньше).

Сложная часть - это намерения и многое другое. * (Изменить: см. Ниже).

Я думаю, причина в том, что это рекомендуемый способ - сохранить память и уменьшить сложность и сцепление. Если вы обмениваете фрагменты, FragmentManager поддерживает ссылку на этот фрагмент для back-stack. Это также упрощает то, что должно быть "запущено" для пользователя. Эта настройка также отделяет представления, макет и логику в Фрагменте от жизненного цикла активности. Таким образом, фрагмент может существовать в одном действии вместе с другим фрагментом (двухслойным) или в трехпанельной активности и т.д.

* Одним из преимуществ регулярной маршрутизации намерений является то, что вы можете запускать Activity явно из любого места в back-stack. Один пример может быть в случае результатов поиска. (MySearchResults.class).

Прочитайте здесь больше:

http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html

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

Ответ 3

Вот ответ Reto Meier относительно того же, взятого из это видео Основы Основы Android Основы.

Существует несколько причин, по которым вам было бы лучше разорвать ваше приложение в различные виды деятельности.

  • Наличие единой монолитной активности увеличивает сложность вашего кода, что затрудняет чтение, тестирование и поддержку.
  • Делает более сложным создание и управление фильтрами намерений.
  • Увеличивает риск жесткой связи независимых компонентов.
  • Повышает вероятность возникновения рисков безопасности, если одно действие включает в себя как конфиденциальную информацию, так и информацию, которую можно разделить.

Хорошим правилом является создание нового действия при изменении контекста. Например, отображение различных типов данных и при переключении с просмотра на ввод данных.

Ответ 4

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

В шаблоне master-detail есть два действия. Один показывает оба фрагмента на больших экранах и только "главный" фрагмент на меньших экранах. Другой показывает фрагмент детали на меньших экранах.

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

И то, что я прочитал о ActionBarSherlock, заключается в том, что он лучше всего работает с Fragments вместо Activity (но я еще не работал с ним).

ActionBarSherlock больше не имеет отношения к фрагментам, чем собственно панель действий, так как ActionBarSherlock является исключительно резервной копией собственной панели действий.

Ответ 5

Ссылаясь на первый вопрос "Есть ли причина разделить телефонное приложение на многие виды деятельности?" - Да. он просто сводится к доступному пространству, планшет дает больше возможностей для разработчиков, что позволяет разработчикам размещать больше на одном экране. Android сообщает нам, что Действия могут предоставлять экран. Итак, что вы можете сделать с одним большим экраном на планшете, это то, что, возможно, придется распространять на нескольких экранах на телефоне, потому что не хватает места для всех фрагментов.