Яка користь від використання фрагментів в Android, а не переглядів?


102

Розробляючи для Android, ви можете встановити цільовий (або мінімальний) sdk до 4 (API 1.6) та додати пакет сумісності Android (v4), щоб додати підтримку Fragments. Вчора я це зробив і успішно реалізував, Fragmentsщоб візуалізувати дані з користувацького класу.

Моє запитання таке: яка вигода від використання Fragmentsна відміну від простого перегляду від користувальницького об'єкта та підтримки API 1.5?

Наприклад, скажіть, що у мене клас Foo.java:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

Обидва методи дуже прості у створенні та роботі з діяльністю, яка, скажімо, має List<Foo>відображення (наприклад, програмне додавання кожного до а ScrollView), тому Fragmentsнасправді це все корисно, або вони є лише надто прославленим спрощенням отримання представлення даних, наприклад, через код вище?


2
Фрагменти не повинні мати інтерфейс користувача, вони можуть бути просто повторними. Погляд був би зайвим у такому випадку.
Philipp Reichart

Я відповів на це в іншому запитанні. Див. Stackoverflow.com/a/14912608/909956 T; dr - іноді фрагменти дозволяють створювати більше компонентів для багаторазового використання, ніж покладаються на реалізацію спеціального перегляду. дивіться посилання, чому.
numan salati

Відповіді:


172

Основна причина використання фрагментів - це функції заднього кута та життєвого циклу. В іншому випадку користувацькі подання мають більш легку вагу та простіші у виконанні.

Спочатку я намагався створити додаток для телефону / планшета, використовуючи власні представлення даних. Все з'явилися на роботу через телефони і таблетки, навіть перехід від однієї панелі до роздільним панелі. Там, де я зіткнувся з проблемою, було кнопка повернення назад та життєвий цикл. Оскільки я просто оновлював перегляди вручну ... нічого не відстежували історію поглядів та їхні стани. Тому кнопка "назад" не працювала так, як очікувалося, і важко було відтворити навіть останні стан під час подій життєвого циклу, наприклад, під час обертання програми. Щоб виправити це, мені довелося загортати власні власні представлення у фрагменти та використовувати FragmentManager, щоб попередні стани були збережені та відтворені.

Я зрозумів, відповівши, що відповів на подібне запитання роком раніше: https://stackoverflow.com/a/11126397/618881


14
Дуже гарна відповідь. Я просто хотів додати, що фрагменти можна вкладати з 4.2 або підтримувати бібліотеку rev 11.
kar

2
Дякую @Karlo за оновлення. Я не вважав це концептуально можливим, але вони обійшли його, використовуючи приватний FragmentManager через getChildFragmentManager (). О, і це API 17, а не 11, і доступний через бібліотеку підтримки.
Генрі

2
Я просто ще раз переглядав це питання, і мій досвід теж змінився. Це відповідь, яка добре розуміє як переваги, так і недоліки, і є дуже корисною. Дякую!
Філ

2
Хочете поставити +1 цій відповіді, але це знищить поточний бал. Крім того, 70 - це не мій улюблений номер.
Бенах

1
Протягом минулого року я також думав, що фрагменти не надають жодної додаткової звичайної функції, але я переконався, що після натискання на активність я втрачав усі завантажені в ньому зображення, тому довелося додати реалізацію кешу, тепер я думаю про використання фрагменти, це може бути дуже просто
Shirish Herwade

27

Я б сказав, що фрагменти корисні у двох сценаріях: якщо ви розділите погляди на деяких пристроях / орієнтаціях і показуєте їх у двох заходах та показуєте весь вміст в одному на інших пристроях. Це буде корисним випадком, якщо ви переходите на планшет або, можливо, навіть в альбомному режимі по телефону: наприклад, ви показуєте список елементів та деталі на одному екрані. по телефону або в портретному режимі ви просто показуєте одну частину.

Іншим випадком використання є перегляди для багаторазового використання. Тож якщо у вас є кілька поглядів, які видно в різних видах діяльності, а також виконуються деякі дії, ви можете помістити цю поведінку у фрагмент, а потім повторно використати її. Очевидно, ви, напевно, могли це зробити і зі спеціальними віджетами.

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


Дякую, це безумовно було корисно. Я думаю, я буду дотримуватися поглядів і зробити свій власний "задній стек", щоб зробити їх багаторазовими.
Філ

3

Android представила фрагменти в Android 3.0 (API рівня 11), в першу чергу для підтримки більш динамічних та гнучких дизайнів інтерфейсу на великих екранах, таких як планшети. Оскільки екран планшета набагато більший, ніж у телефону, є більше місця для комбінування та обміну компонентами інтерфейсу користувача. Фрагменти дозволяють зробити такі проекти без необхідності керування складними змінами в ієрархії перегляду. Розділивши макет діяльності на фрагменти, ви зможете змінити зовнішній вигляд діяльності під час виконання та зберегти ці зміни у задній стеці, якою керує діяльність.

Тут ви можете прочитати більше.


Я прочитав всю документацію, однак шукав щось, що краще пояснює їхню користь, наприклад, для планшетів або зарізниць
Phil

3
  1. Екран розділеного сценарію - у нас є одна компонування та одна діяльність, яка обробляє частину лівого екрана
  2. Фрагмент сценаріюАктивність у нас є один макет для головного екрану, один для лівого праворуч

Сценарій перший хороший, якщо у вас просте застосування.

Сценарій другий хороший, якщо ви хочете мати кілька фрагментів і кілька фрагментівActivities, і ви можете комбінувати кожен з них. Також ви можете здійснювати взаємодію між фрагментами.

Я розділив фрагментарність екрана, я можу викликати його за допомогою "Намір додатків" і сказати fragmentActivity, який фрагмент потрібно завантажити. Фрагменти хороші тим, що вони не виявляються, тому ви можете зробити фрагменти багаторазового використання та FragmentActvity.

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

І я річ, що ці фрагменти приходять трохи пізно, тож потрібно спробувати мислити по-новому. Можливо, просто спробуйте перетворити свою діяльність на FragmentActivity. Пізніше спробуйте знайти код для багаторазового використання і зробити з нього фрагмент.

Його корисно, але я не знаю, як зараз. Але у мене є деякі ідеї.

Це завжди проблема. Команда Android зробила щось продумане, і ніхто не знає, для чого це добре. Тому що ми навчимось навчитися так, як це було, і тут з’являються якісь нові речі.

На мою думку, це добре, але не з причини, про що нам говорять.


0

Додайте один випадок, коли використовується фрагмент або активність над CustomView:

Якщо ви використовуєте CursorLoader для спостереження за певними переглядами, ListView або TextView і хочете оновити їх показне значення кожного разу, коли дані вашого ContentProvider оновлюються на зворотному кінці (найчастіший випадок, коли у вас є служба, яка оновлює локальну базу даних, періодично оглядаючи дані з віддаленої бази даних / хмари )


-2

Одне важливе, що всі вищезгадані коментарі не згадують - це те, що фрагмент залишається в пам'яті, навіть якщо Android вбиває активність і перезапускає її, коли ви робите щось на зразок зміни орієнтації свого пристрою. Це робиться з міркувань продуктивності, але також може призвести до несподіваних результатів, якщо ви очікували, що фрагменти будуть знищені лише для того, щоб виявити, що вони відтворюються з нізвідки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.