Что такой фрагмент в Андроид программы

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

Фрагменты — это «высокоуровневые виджеты».

В делфи также есть фрагменты. Они называются «фреймы» (класс TFrame).

Отслеживать
ответ дан 10 апр 2014 в 20:12
112k 6 6 золотых знаков 91 91 серебряный знак 158 158 бронзовых знаков

У них есть ещё одна потрясная функция — setRetainInstance(boolean). Это позволяет обойти некоторые ограничения lifecycle activity и сохранять данные/логику прямо во фрагментах. Другими словами при назначении этого флага фрагмент не уничтожается как activity а осатется до выхода из программы. Ну а DialogFragment позволит вам довольно просто добавлять свой собственный View для диалогового окна.

Уроки Android Studio с нуля / #8 – Фрагменты (Fragments)

Отслеживать
ответ дан 10 апр 2014 в 20:48
3,395 2 2 золотых знака 19 19 серебряных знаков 42 42 бронзовых знака

Фрагмент (Fragment) — является модульной частью активити. Для архитектуры в Android удобно воспринимать, как продолжение основной View, иногда называют SubView. Очень хорошо описаны фрагменты в оф доках: https://developer.android.com/guide/components/fragments.html?hl=ru

Смысл фрагментов и их основное преимущество изначально заключалось в том, что вы можете показать 2 фрагмента на 1 Screen. Но вы не можете показать 2 Activity в 1 Screen, это невозможно (кроме мультипроцессов, MultiWindow). Позже данный подход в MaterialDesign получил название, как правильная организация интефрейсов и навигации и название его MasterDetailFlow. Данную концепию, очень удобно организовывать именно через фрагменты. Иначе приходилось бы писать отдельную логику для допольнительной ситуации, и поддерживать обе части, что очень плохо.

Сейчас Фрагменты в Android являются неотъемлемой частью разработки полноценных приложений, и они используеются системой с API 3.0. Фрагметны позволяют создавать более удобную декомпозицию View, они лекго заменяемы в Activtiy, и могут лекго переезжать в другие проекты. Только с помощью фрагментов вы можете правильно организовать ViewWidgetы: NavigationView, DrawerLayout, NavigationBottom, BottomSheet, FragmentsDailogs, ViewPagers etc. (кончено можно и без, но порой это сложно или очень сложно) Создать красивые переходы и анимации намого лечге, а порой (Transitions) можно только с помощью фрагментов.

Читайте также:
Программа 1с торговля и склад инструкция

Источник: ru.stackoverflow.com

Фрагменты

Организация приложения на основе нескольких activity не всегда может быть оптимальной. Мир ОС Android довольно сильно фрагментирован и состоит из многих устройств. И если для мобильных аппаратов с небольшими экранами взаимодействие между разными activity выглядит довольно неплохо, то на больших экранах — планшетах, телевизорах окна activity смотрелись бы не очень в силу большого размера экрана. Собственно поэтому и появилась концепция фрагментов.

Уроки Андроид программирования | #11 — Фрагменты

Фрагмент представляет кусочек визуального интерфейса приложения, который может использоваться повторно и многократно. У фрагмента может быть собственный файл layout, у фрагментов есть свой собственный жизненный цикл. Фрагмент существует в контексте activity и имеет свой жизненный цикл, вне activity обособлено он существовать не может. Каждая activity может иметь несколько фрагментов.

Фрагменты в Android

Для начала работы с фрагментами создадим новый проект с пустой MainActivity. И вначале создадим первый фрагмент. Но сразу стоит отметить, что не вся функциональность фрагментов по умолчанию может быть доступна в проекте, поскольку располагается в отдельной библиотеке — AndroidX Fragment library . И вначале необходимо подключить к проекту эту библиотеку в файле build.gradle .

Подключение фрагментов и AndroidX Fragment library в Android и Java

Найдем в нем секцию dependencies , которая выглядит по умолчанию примерно так:

dependencies

В ее начало добавим строку

implementation «androidx.fragment:fragment:1.3.6»

То есть в моем случае получится

dependencies

Подключение фрагментов и AndroidX Fragment library в Android и Java и Gradle

И затем нажмем на появившуюся ссылку Sync Now .

Фактически фрагмент — это обычный класс Java, который наследуется от класса Fragment . Однако как и класс Activity, фрагмент может использовать xml-файлы layout для определения графического интерфейса. И таким образом, мы можем добавить по отдельности класс Java, который представляет фрагмент, и файл xml для хранения в нем разметки интерфейса, который будет использовать фрагмент.

Итак, добавим в папку res/layout новый файл fragment_content.xml и определим в нем следующий код:

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

package com.example.fragmentapp; import androidx.fragment.app.Fragment; public class ContentFragment extends Fragment < public ContentFragment()< super(R.layout.fragment_content); >>

Класс фрагмента должен наследоваться от класса Fragment .

Чтобы указать, что фрагмент будет использовать определенный xml-файл layout, идентификатор ресурса layout передается в вызов конструктора родительского класса (то есть класса Fragment).

Весь проект будет выглядеть следующим образом:

Фрагменты в Android Studio и Java

Добавление фрагмента в Activity

Для использования фрагмента добавим его в MainActivity . Для этого изменим файл activity_main.xml , которая определяет интерфейс для MainActivity:

Читайте также:
Виды программ для общения

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

Его атрибут android:name указывает на имя класса фрагмента, который будет использоваться. В моем случае полное имя класса фрагмента с учетов пакета com.example.fragmentapp.ContentFragment .

Код класса MainActivity остается тем же, что и при создании проекта:

Если мы запустим приложение, то мы увидим фактически тот же самый интерфейс, который мы могли бы сделать и через activity, только в данном случае интерфейс будет определен во фрагменте:

Создание фрагмента для Android и Java

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

Для этого нажмем на папку, где находится класс MainActivity , правой кнопкой мыши и в появившемся меню выберем New -> Fragment -> Fragment(Blank) :

Добавление фрагмента в Android Studio

Немного о Fragment

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

Fragment — модульная часть activity, у которой свой жизненный цикл и свои обработчики различных событий. Android добавил фрагменты с API 11, для того, чтобы разработчики могли разрабатывать более гибкие пользовательские интерфейсы на больших экранах, таких как экраны планшетов. Через некоторое время была написана библиотека, которая добавляет поддержку фрагментов в более старые версии.

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

Основные классы

Есть три основных класса:
android.app.Fragment — от него, собственно говоря. и будут наследоваться наши фрагменты
android.app.FragmentManager — с помощью экземпляра этого класса происходит все взаимодействие между фрагментами
android.app.FragmentTransaction — ну и этот класс, как понятно по названию, нужен для совершения транзакций.
В настоящее время появляются разновидности класса Fragment, для решения определенных задач — ListFragment, PreferenceFragment и др.

Основы работы с fragment’ами

Чтобы создать фрагмент все что нужно это наследовать свой класс от Fragment. Чтобы привязать фрагмент к определенной разметке нужно определить в нем метод onCreateView(). Этот метод возвращает View, которому и принадлежит ваш фрагмент.

Чтобы получить это View из любого места фрагмента достаточно вызвать getView()

Фрагмент мы создали, но хотелось бы поместить его на экран. Для этого нам нужно получить экземпляр FragmentManager и совершить нужную нам транзакцию.
Сначала нужно узнать что мы с фрагментом можем сделать:
add() — добавление фрагмента
remove() — удаление фрагмента
replace() — замена фрагмента
hide() — делает фрагмент невидимым
show() — отображает фрагмент

Читайте также:
Программа которая будет нажимать кнопку через время

Так же для того чтобы добавлять наши транзакции в стек, как это происходит по умолчанию с активностями, можно использовать addToBackStack(String), а чтобы вернуть предыдущее состояние стэка нужно вызвать метод popBackStack().

Добавим фрагмент на экран:

ExampleFragment youFragment = new ExampleFragment(); FragmentManager fragmentManager = getFragmentManager() fragmentManager.beginTransaction() // получаем экземпляр FragmentTransaction .add(R.id.container_for_fragments, youFragment) .addToBackStack(«myStack») .commit(); // вызываем commit для совершения действий FragmentTransaction

Как связать activity и fragment?

Чтобы вызывать методы активити, достаточно получить его экземпляр через метод getActivity()

if (getActivity() != null) MainActivity act = (MainActivity ) getActivity();

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

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

  • сериализовать объект
  • передать объект в контейнере Parcel, переопределив методы Parcable
  • кое-где видел, что для создания фрагмента через переопределенный конструктор, создают статический фабричный метод

Покажу как это делается для второго варианта, так как для android более правильно использовать Parcel для передачи параметров между активностями и фрагментами.

public class MyObject implements Parcelable < public String paramOne; public int paramToo; public MyObject(String paramOne, int paramToo) < this.paramOne = paramOne; this.paramToo = paramToo; >private MyObject(Parcel parcel) < // Создание объекта через Parcel paramOne = parcel.readString(); paramToo = parcel.readInt(); >public int describeContents() < return 0; >public void writeToParcel(Parcel parcel, int flags) < //Упаковывание объекта в Parcel parcel.writeString(paramOne); parcel.writeInt(paramToo); >public static final Parcelable.Creator CREATOR = new Parcelable.Creator() < // Статический метод с помощью которого создаем обьект public MyObject createFromParcel(Parcel in) < return new MyObject(in); >public MyObject[] newArray(int size) < return new MyObject[size]; >>; >

Здесь мы реализовали интерфейс Parcelable в классе, который хотим передавать между фрагментами.
Чтобы передать его во фрагмент нужно сделать следующее:

MyObject obj = new MyObject(«Строка», 1 ); Bundle bundle = new Bundle(); bundle.putParcelable(«key», obj); youFragment.setArguments(bundle);

Дальше нужно всего лишь получить переданный нами объект в методе onCreateView() нового фрагмента:

UPD. исправил получение объекта obj из getArguments(), спасибо firexel

Анимация фрагментов

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru