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


интро:

основной шаблон "фрагменты учебник" идет что-то вроде этого:

  1. на планшете, есть список слева, информация справа.
  2. оба Fragments и оба находятся в одном и том же Activity.
  3. по телефону, есть список Fragment в одном Activity.
  4. запуск нового Activity с реквизитами Fragment.

(например,Android 3.0 фрагменты API от Dianne Hackborn и фрагменты API Guide)

на обоих устройствах, функциональность в Fragments. (просто)

на планшет, всего приложение 1 Activity на телефон, есть много Activities.


вопросы:

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

один с помощью этого метода, что вы дублировать много логики в главном планшете Activity, а в отдельном телефоне Activities.

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

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

также то, что я читал о ActionBarSherlock это, кажется, лучше всего работает с Fragments вместо Activities (но я не работал с ним).

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


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

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


обновления

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

также нашел интересную статью ребят на площади, которую стоит прочитать:

5 179

5 ответов:

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

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


Я предпочитаю шаблон, используемый ActionBarSherlock фрагменты демо-приложение (скачать тут и здесь исходный код). Демо, которое наиболее точно соответствует учебник, упомянутый в вопросе, называется "макет" в приложении; или 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);
        }
    }

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

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

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

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

вот так:

enter image description here

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

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

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

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

сложная часть-это маршрутизация намерений и еще много чего. *(Редактировать: см. подробнее ниже).

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

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

прочитать вот еще:

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

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

вот ответ Рето Мейера относительно того же, взятый из видео на курс основ Android от Udacity.

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

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

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

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

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

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

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

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

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