# Фрагменти

Fragment е част от Activity, коeто позволява по-модулен дизайн на дейностите. Fragment представлява поведение или част от потребителския интерфейс в даденo Activity. Можем да комбинираме множество фрагменти в едно Activity, за да изградим интерфейс с множество панели и да използваме отново фрагмент в много Activity-та. Жизненият цикъл на фрагмента е пряко засегнат от жизнения цикъл на родителското Activity.

Фрагмент обикновено определя част от потребителския интерфейс. Фрагментите трябва да бъдат вградени в Activity те не могат да работят независимо.

### Характеристики

* Фрагментите включват изгледи и логика, така че да е по-лесно да се използва повторно в Activity.
* Фрагментите са самостоятелни компоненти, които могат да съдържат изгледи, събития и логика.
* Приложенията, ориентирана към фрагменти, дейностите стават навигационни контейнери за навигацията към други дейности, представящи фрагменти и предаващи данни.

### Употреба на фрагменти:

* Повторното използване на "View" или "Логика" – Фрагментите позволяват повторното използване на части от екрана, включително изгледи и логика на събитията по различни начини в много различни дейности. Например, използването на един и същ списък в различни източници на данни в дадено приложение.
* Tablet Support - Фрагментите позволяват специфични да се изграждат версии на телефон, която е различна от версията на таблета.
* Ориентация на екрана - Често в рамките на приложения, портретната версия на дадена дейност има значително различно оформление от пейзажната версия. Фрагментите позволяват на двете ориентации да използват повторно споделени елементи, като същевременно имат различия.

### Качество на кода

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

Activity има навигационна отговорност:

* Навигация към други Activity.
* Представяне на навигационни компоненти като чекмеджето за навигация или на устройството за преглед.
* Скриване и показване на съответните фрагменти с помощта на мениджъра на фрагменти.
* Получаване на данни от Intent и предаване на данни между фрагменти.

Фрагментите са контролери на съдържание и съдържат повечето изгледи, оформления и логика:

* Изгледи, показващи подходящо съдържание на приложението.
* Логика за обработка на събития, свързана със съответните изгледи.
* Преглед на логиката за управление на състоянието, като например видимост или обработка на грешки.
* Задействане на мрежова заявка.
* Извличане и съхранение на данни.

## Използване

### Дефиниране на фрагмент

Fragment, подобно на Activity, има XML файл за оформление и Java клас, който служи за контрол на фрагмент.

**layout->New->Fragment**

Класа на fragmenta наследява базовия клас Fragment и овърайдва методите:

* `onCreateView` - дефинира изгледа на фрагмента
* `onViewCreated` - зарежда визуалните елементи от изгледа в Java обекти

### Вграждане на фрагмент

Добавяне на фрагмента динамично в Java става с помощта на класът FragmentTransaction. Класа позволява да се добавят, премахват и заместват фрагменти в оформлението на Activity по време на работа.

В този случай искате да добавите контейнер контейнер "контейнер" (обикновено a ) към вашата дейност, където фрагментът се вмъква по време на изпълнение:FrameLayout

* в activity\_main.xml се добавя FrameLayout
* в MainActivity.java се добавя:

// Създаване на \
FragmentTransaction FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); // Запълване на съдържанието на FrameLayout с новия фрагмент \
ft.replace(R.id.your\_placeholder, new FooFragment()); // or ft.add(R.id.your\_placeholder, new FooFragment()); // Потвърждаване на замяната \
ft.commit();

### Предаване на данни от Activity кум Fragment

За да се усигори съвместимост между ключовете на данните, който се изпращат от Activity кум Fragment е препоръчително да се създаде клас за създаване на фрагменти с данни

**Пример:**

```
    //предаване на данните
    public static CustomFragment newInstance(String name) {
        CustomFragment customFragment = new DemoFragment();
        Bundle args = new Bundle();
        args.putString("user_name", name);
        customFragment.setArguments(args);
        return customFragment;
    }
```

```
    //приемане на данните
    String name = getArguments().getString("user_name", "");	
```
