Sfoglia il codice sorgente

фрагменты

Евгений Колесников 3 anni fa
parent
commit
c7cd3e761a
6 ha cambiato i file con 74 aggiunte e 0 eliminazioni
  1. 72 0
      articles/fragments.md
  2. BIN
      img/fragments_01.png
  3. BIN
      img/fragments_02.png
  4. BIN
      img/fragments_03.png
  5. BIN
      img/fragments_04.png
  6. 2 0
      readme.md

+ 72 - 0
articles/fragments.md

@@ -0,0 +1,72 @@
+# Фрагменты
+
+>Содрано [отсюда](https://metanit.com/java/android/8.1.php)
+
+## Введение во фрагменты
+
+Организация приложения на основе нескольких *activity* не всегда может быть оптимальной. Мир ОС Android довольно сильно фрагментирован и состоит из многих устройств. И если для мобильных аппаратов с небольшими экранами взаимодействие между разными *activity* выглядит довольно неплохо, то на больших экранах - планшетах, телевизорах окна *activity* смотрелись бы не очень в силу большого размера экрана. Собственно поэтому и появилась концепция фрагментов.
+
+**Фрагмент** представляет кусочек визуального интерфейса приложения, который может использоваться повторно и многократно. У фрагмента может быть собственный файл разметки (layout), у фрагментов есть свой собственный жизненный цикл. Фрагмент существует в контексте *activity* и имеет свой жизненный цикл, вне *activity* обособлено он существовать не может. Каждая *activity* может иметь несколько фрагментов.
+
+![](../img/fragments_01.png)
+
+Для начала работы с фрагментами создадим новый проект с пустой MainActivity.
+
+Фактически фрагмент - это обычный класс, который наследуется от класса **Fragment**. Однако как и класс **Activity**, фрагмент может использовать xml-файлы разметки для определения графического интерфейса. И таким образом, мы можем добавить по отдельности класс, который представляет фрагмент, и файл xml для хранения в нем разметки интерфейса, который будет использовать фрагмент.
+
+Android Studio представляет готовый шаблон для добавления фрагмента.
+
+Для этого нажмем на папку, где находится класс **MainActivity**, правой кнопкой мыши и в появившемся меню выберем **New -> Fragment -> Fragment(Blank)**:
+
+![Создание фрагмента](../img/fragments_02.png)
+
+>Обратите внимание на именование: имя класса состоит из описательной части (content) и суффикса, обозначающего тип элемента (fragment). Название файла разметки (layout) генерируется автоматически по названию класса.
+
+В файле разметки `fragment_content.xml` в качестве корневого контейнера по умолчанию используется **FrameLayout**
+
+```xml
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ContentFragment">
+
+</FrameLayout>
+```
+
+>В этом контейнере потомки никак не позиционируются и накладываются друг на друга. Можно либо задавать границы элементов потомков, либо положить другой контейнер (например, LinearLayout) и в него уже помещать все остальные.
+>
+>```xml
+><LinearLayout
+>    android:layout_width="match_parent"
+>    android:layout_height="match_parent"
+>    android:orientation="vertical">
+>    <Button
+>        android:id="@+id/updateButton"
+>        android:layout_width="match_parent"
+>        android:layout_height="wrap_content"
+>        android:text="Обновить" />
+>
+>    <TextView
+>        android:id="@+id/dateTextView"
+>        android:layout_width="match_parent"
+>        android:layout_height="wrap_content"
+>        android:text="Hello from Fragment"
+>        android:textSize="28sp"/>
+>
+></LinearLayout>
+>```
+
+Теперь мы можем поместить готовый фрагмент в основное окно. В разметку файла `activity_mail.xml` добавьте контейнер FragmentContainerView из палитры элементов
+
+![](../img/fragments_03.png)
+
+Система запросит какой фрагмент вы хотите поместить в контейнер:
+
+![](../img/fragments_04.png)
+
+Не забудьте установить позицию и размер контейнера
+
+Фрагмент успешно добавлен и приложение запускается и работает, но надо учитывать, что теперь логика работы с элементами фрагмента должна быть реализована в классе фрагмента (**ContentFragment**)
+

BIN
img/fragments_01.png


BIN
img/fragments_02.png


BIN
img/fragments_03.png


BIN
img/fragments_04.png


+ 2 - 0
readme.md

@@ -381,6 +381,8 @@ ERD,
 
 1. [Проект погода (продолжение): SplashScreen (заставка). Выбор города. Выбор и отображение массива значений (почасовая, ежедневная). Разбор XML.](./articles/weather2.md)
 
+1. [Фрагменты](./articles/fragments.md)
+
 1. [Принципы навигации внутри и между андроид-приложениями](./articles/navigation.md)
 
 1. [Проект "база". Авторизация на сервере (Basic auth, token).](./articles/android_auth.md)