Почему фрагменты, а когда использовать фрагменты вместо действий?

В Android API 11+ Google выпустил новый класс под названием Fragment.

В видеороликах Google предлагает по возможности (link1, link2), мы должны использовать фрагменты вместо действий, но они не объяснили, почему именно.

Какова цель фрагментов и их возможное использование (за исключением некоторых примеров пользовательского интерфейса, которые могут быть легко достигнуты с помощью простых представлений/макетов)?

Мой вопрос о фрагментах:

  • Каковы цели использования фрагмента?
  • Каковы преимущества и недостатки использования фрагментов по сравнению с использованием действий/представлений/макетов?

Бонусные вопросы:

  1. Можете ли вы дать некоторые интересные приложения для фрагментов? Что Google не упоминал в своих видеороликах?
  2. Каков наилучший способ общения между фрагментами и действиями, которые их содержат?
  3. Каковы наиболее важные вещи, которые следует помнить при использовании фрагментов? Любые советы и предупреждения из вашего опыта?

Ответ 1

# 1 и # 2, каковы цели использования фрагмента и каковы преимущества и недостатки использования фрагментов по сравнению с использованием мероприятия/виды/макеты?

Фрагменты - это решение для Android для создания пользовательских интерфейсов многократного использования. Вы можете достичь одних и тех же вещей, используя действия и макеты (например, с помощью include). Однако; фрагменты подключены к API Android, от HoneyComb и выше. Позвольте мне уточнить:

  • ActionBar. Если вам нужны закладки для навигации по вашему приложению, вы быстро увидите, что интерфейс ActionBar.TabListener дает вам FragmentTransaction в качестве входного аргумента методу onTabSelected. Возможно, вы могли бы проигнорировать это и сделать что-то еще и умное, но вы будете работать против API, а не с ним.

  • FragmentManager обрабатывает "назад" для вас очень умным способом. Назад не означает возврат к последнему действию, как для обычной деятельности. Это означает возврат к предыдущему состоянию фрагмента.

  • Вы можете использовать классный ViewPager с FragmentPagerAdapter для создания интерфейсов swipe. Код FragmentPagerAdapter намного чище, чем обычный адаптер, и он управляет экземплярами отдельных фрагментов.

  • Ваша жизнь будет намного проще, если вы будете использовать Фрагменты при попытке создать приложения для телефонов и планшетов. Поскольку фрагменты так привязаны к API Honeycomb +, вы захотите использовать их на телефонах, чтобы повторно использовать код. Это то, где библиотека совместимости пригодится.

  • Вы даже могли и должны использовать фрагменты для приложений, предназначенных только для телефонов. Если у вас есть мобильность в виду. Я использую ActionBarSherlock и библиотеки совместимости для создания приложений "ICS look", которые выглядят одинаково вплоть до версии 1.6. Вы получаете последние функции, такие как ActionBar, с вкладками, переполнением, панель действий split, viewpager и т.д.

Бонус 2

Лучший способ общения между фрагментами - это намерения. Когда вы нажимаете что-то в фрагменте, вы обычно вызываете StartActivity() с данными на нем. Цель передается всем фрагментам запускаемой вами активности.

Ответ 2

  1. Фрагмент является частью деятельности, которая вносит свой вклад в эту деятельность. Фрагмент можно рассматривать как суб-активность, тогда как полный экран, с которым пользователь взаимодействует, называется "активностью".

  2. Активность может содержать несколько фрагментов. Активность может содержать 0 или несколько фрагментов на основе размера экрана.

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

  4. Фрагмент не может существовать независимо. Это должно быть всегда частью деятельности. Где, поскольку деятельность может существовать без какого-либо фрагмента.

Ответ 3

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

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

Ответ 4

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

Ниже приведены важные моменты об фрагменте:

  • Фрагмент имеет свой собственный макет и его собственное поведение с его собственными обратными вызовами жизненного цикла.

  • Вы можете добавлять или удалять фрагменты в действии во время работы.

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

  • Фрагмент может использоваться в нескольких действиях.

  • Жизненный цикл фрагмента тесно связан с жизненным циклом его активности хозяина.

  • Когда действие приостановлено, все фрагменты, доступные в работе, также будут остановлены.

  • Фрагмент может реализовать поведение, не имеющее компонент пользовательского интерфейса.

  • Фрагменты были добавлены в API Android в Android 3 (Honeycomb) с API версии 11.

Для получения более подробной информации посетите официальный сайт Fragments.

Ответ 5

Это важная информация, которую я нашел на фрагментах:

Исторически каждый экран в приложении Android был реализован как отдельное действие. Это создает проблему при передаче информации между экранами, потому что механизм Намерения Android не позволяет передавать ссылочный тип (то есть объект) непосредственно между Операциями. Вместо этого объект должен быть сериализован или должна быть доступна глобально доступная ссылка.

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

Источник: https://www.pluralsight.com/blog/software-development/android-fragments

Ответ 6

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

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

Я новичок в Android и до сих пор считаю, что фрагмент полезен именно так.

Ответ 7

Я знаю, что это уже обсуждалось до смерти, но я хотел бы добавить еще несколько замечаний:

  • Фраги могут использоваться для заполнения Menu и могут обрабатывать клики MenuItem самостоятельно. Таким образом, вы даете дополнительные варианты модуляции для своей деятельности. Вы можете создавать материалы ContextualActionBar и т.д., Не зная об этом, и можете в основном отделить его от основного материала, который обрабатывает ваша активность (Навигация/Настройки/О программе).

  • Родительский Frag с дочерними Frags может предоставить вам дополнительные возможности для модуляции ваших компонентов. Например. вы можете легко поменять Frags, поместить новые Frags внутри пейджера или удалить их, переставить их. Все без вашей деятельности, зная что-нибудь об этом, просто фокусируясь на материалах более высокого уровня.

Ответ 8

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

  • вы можете самостоятельно манипулировать каждым фрагментом, например добавлять или удалять их. Когда вы выполняете такую транзакцию фрагмента, вы также можете добавить ее в задний стек, который управляется активностью - каждая запись в предыдущем стеке в активности представляет собой запись о транзакции фрагмента, которая произошла. Задний стек позволяет пользователю отменить транзакцию фрагмента (перемещаться назад), нажав кнопку "Назад".

  • Когда вы добавляете фрагмент как часть вашего макета активности, он живет в ViewGroup внутри иерархии видов деятельности, а фрагмент определяет свой собственный макет представления. Вы можете вставить фрагмент в свой макет деятельности, объявив фрагмент в файле макета активности, как элемент или из вашего кода приложения, добавив его в существующую ViewGroup. Однако фрагмент не требуется, чтобы быть частью макета активности; вы также можете использовать фрагмент без собственного пользовательского интерфейса в качестве невидимого работника для этой деятельности.

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

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

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

    Ящик с фрагментами вместо упражнений

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

  • Связь между фрагментом и его активностью. Чтобы позволить фрагменту связываться с его активностью, вы можете определить интерфейс в классе Fragment и реализовать его в Activity. Фрагмент фиксирует реализацию интерфейса во время его жизненного цикла onAttach(), а затем может вызовите методы интерфейса, чтобы связаться с Activity.

    public class YourFragment extends ListFragment {
    OnSelectedListener mCallback;
    
    // Container Activity must implement this interface
    public interface OnSelectedListener {
        public void onItemSelected(int position);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.your_view, container, false);
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnSelectedListener");
        }
    }
    
    }...
    

Теперь фрагмент может доставлять сообщения в действие, вызывая метод onItemSelected() (или другие методы в интерфейсе), используя экземпляр mCallback интерфейса OnSelectedListener.

public static class MainActivity extends Activity
        implements YourFragment.OnSelectedListener{
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }

    public void onItemSelected(int position) {
        // The user selected the headline of an article from the YourFragment
        // Do something here to display that article

        YourFragment yourFrag = (YourFragment)
                getSupportFragmentManager().findFragmentById(R.id.your_fragment);

        if (yourFrag != null) {
            // If your frag is available, we're in two-pane layout...

            // Call a method in the YourFragment to update its content
            yourFrag.updateView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected item
            YourFragment newFragment = new YourFragment();
            Bundle args = new Bundle();
            args.putInt(YourFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}

Ответ 9

Фрагмент живет внутри действия.

Пока действие живет само по себе.

Ответ 10

Фрагменты живут внутри Activity и имеют:

  • собственный жизненный цикл
  • собственный макет
  • его собственные дочерние фрагменты и т.д.

Подумайте о фрагментах как о субактивности основной деятельности, к которой она принадлежит, она не может существовать сама по себе и ее можно снова и снова называть/повторно использовать. Надеюсь, это поможет:)

Ответ 11

1. Предполагается использовать фрагмент?

  • Ans:
    1. Работа с различиями форм-фактора устройства.
    2. Передача информации между экранами приложений.
    3. Организация пользовательского интерфейса.
    4. Расширенные метафоры пользовательского интерфейса.

Ответ 12

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

Пример:

Деятельность A, Деятельность B, Деятельность C:

  • Все действия должны повторяться в одном и том же коде, например, для отображения базовой панели инструментов, или наследоваться от родительского действия (управление становится громоздким).
  • Чтобы перейти от одного действия к другому, либо все они должны находиться в памяти (накладные расходы), либо одно должно быть уничтожено, чтобы открылось другое.
  • Связь между действиями может быть сделана через Intents.

против

Занятие А, Фрагмент 1, Фрагмент 2, Фрагмент 3:

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