Работа с фрагментами в Android приложении
Главная » Работа с фрагментами в Android приложении

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

Фрагменты представляют как бы часть пользовательского интерфейса Activity. Фрагменты можно многократно использовать и как в одном Activity, так и подключать их в различные Activity. Кроме того, их можно подключать и удалять с экрана даже прямо во время работы приложения. Например, если вы зададите некоторые объекты на экране (кнопки, переключатели и т.д.), то во время работы приложения вы не сможете их скрыть, это можно сделать только при редактировании файла layout. Используя же фрагменты, можно с помощью заданных кнопок в любое время добавлять или убирать дополнительные объекты пользовательского интерфейса, определенные вами в фрагментах. 

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

Перейдем от теории к практике. Создаем новый проект, названия по умолчанию, берем Blank Activity. Сначала давайте зайдем в activity_main.xml и добавим следующие элементы:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <Button
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/b1"
 android:text="Кнопка 1"/>
 <Button
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/b2"
 android:text="Кнопка 2"/>
 <RadioButton
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/rb"
 android:text="Переключатель 1"/>
 <ToggleButton
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/tb"/>
 <ImageView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/iv"
 android:src="@drawable/ic_launcher"
 android:layout_gravity="center"/>
 
</LinearLayout>

 Интерфейс примет вид:

Мы настроили внешний вид нашего Activity, как мы это делаем обычно. Но теперь давайте поделим этот вид на отдельные 3 вида.

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <Button
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/b1"
 android:text="Кнопка 1"/>
 <Button
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/b2"
 android:text="Кнопка 2"/>
</LinearLayout>

Создаем в этой же папке еще один файл fragment2.xml и добавляем в него два переключателя:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <RadioButton
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/rb"
 android:text="Переключатель 1"/>
 <ToggleButton
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/tb"/>
</LinearLayout>

И еще 1 файл fragment3.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <ImageView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/iv"
 android:src="@drawable/ic_launcher"
 android:layout_gravity="center"/>
</LinearLayout>

Теперь примемся за создание самих фрагментов, они имеют расширение java. В папке, хранящей файл MainActivity.java создаем новый пакет с именем fragments:

В этом пакете fragments создаем 3 файла java класса: fragment1fragment2fragment3:

Теперь возьмемся за редактирование созданных классов фрагментов. Открываем файл fragment1.java. Чтобы наше приложение с фрагментами работало и на более старых версиях ОС Android, добавим в импорт классов фрагментов строку:

import android.support.v4.app.Fragment;

Добавим в файл fragment1.java наследование класса Fragment, вместо метода onCreate в этом случае используют onCreateView, зададим внешний вид класса с созданного раньше layout - файла fragment1.xml:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import home.study.R;

public class fragment1 extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
 container, @Nullable Bundle savedInstanceState) {

 //Устанавливаем нашему классу внешний вид с fragment1.xml:
 View frag1 = inflater.inflate(R.layout.fragment1,container,false);
 return frag1;
 }
}

Открываем файл fragment2 и делаем аналогично:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import home.study.R;

public class fragment2 extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable
 ViewGroup container, @Nullable Bundle savedInstanceState) {

 //Устанавливаем нашему классу внешний вид с fragment2.xml:
 View frag2 = inflater.inflate(R.layout.fragment2,container,false);
 return frag2;
 }
}

Ну и класс fragment3: 

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import home.study.R;

public class fragment3 extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable
 ViewGroup container, @Nullable Bundle savedInstanceState) {

 //Устанавливаем нашему классу внешний вид с fragment3.xml:
 View frag3 = inflater.inflate(R.layout.fragment3,container,false);
 return frag3;
 }
}

Все, фрагменты созданы. Давайте теперь отредактируем файл activity_main.xml, используя созданные фрагменты. Добавляем в  activity_main.xml следующий код:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 xmlns:tools="http://schemas.android.com/tools">
 <fragment
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:name="home.study.fragments.fragment1"
 tools:layout="@layout/fragment1"/>
 <fragment
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:name="home.study.fragments.fragment2"
 tools:layout="@layout/fragment2"/>
 <fragment
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:name="home.study.fragments.fragment3"
 tools:layout="@layout/fragment3"/>
</LinearLayout>

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

Но теперь то мы знаем, что, не взирая на внешний вид, элементы на экране входят в 3 различных фрагмента, любой из которых можно при желании отключить, использовать несколько раз (продублировать), использовать на других Activity, не создавая массу однотипных layout файлов для каждого окна программы.

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

Категория: Уроки программирования | Просмотров: 1718 | Добавил: Oleg | Рейтинг: 5.0/3
Всего комментариев: 1
avatar
1 stupnikovcom • 18:46, 28.09.2015
Очень интересный урок. Как я понял фрагменты являются составной частью активности. т.е. для экономии используемых ресурсов приложения можно не создавать несколько активностей и переходы между ними, а использовать именно несколько фрагментов в одной активности?
Спрашиваю лишь по той причине, что в процессе изучения программирования под андроид задался целью написать простую интерактивную книгу с несколькими десятками страниц и переходов между ними. Думаю для этих целей лучше использовать фрагменты а не активности?
avatar