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



В первую очередь заменим разметку лэйаута MainActivity на такую:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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"

android:orientation="horizontal"

tools:context="com.example.myfragment.MainActivity">

<FrameLayout

   android:id="@+id/mycontainer"

   android:layout_width="match_parent"

   android:layout_height="match_parent" />

</LinearLayout>

FrameLayout в данном случае будет служить контейнером для фрагмента.

Теперь в конце метода onCreate() в MainActivity добавим такой код:

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

FragmentManager — специальный класс, через который происходит взаимодействие с фрагментами.

При запуске приложения результат останется тем же.

Двухпанельный лэйаут

Нам нужно будет два лейаута для MainActivity: один для телефонов, второй для планшетов.

Создадим лэйаут для планшета. Это делается так же, как и обычно с одним отличием:

Был выбран квалификатор Smallest screen width и введено значение 600. Таким образом, этот лэйаут будет использоваться только на тех устройствах, ширина экрана которых составляет хотя бы 600dp. Это примерно соответствует планшету с диагональю экрана 7 дюймов.

Стандартная вёрстка (для телефонов) будет такой:

<?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="com.example.myfragment.MainActivity">

<fragment

   android:id="@+id/selection_fragment"

   class="com.example.myfragment.SelectionFragment"

   android:layout_width="match_parent"

      android:layout_height="match_parent" />

</FrameLayout>

 

Вёрстка же для планшетов будет такой:

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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"

android:orientation="horizontal"

tools:context="com.example.myfragment.MainActivity"

android:baselineAligned="false">

<fragment

   android:id="@+id/selection_fragment"

   class="com.example.myfragment.SelectionFragment"

   android:layout_width="0dp"

   android:layout_height="match_parent"

   android:layout_weight=".3" />

<FrameLayout

   android:id="@+id/mycontainer"

   android:layout_width="0dp"

   android:layout_height="match_parent"

   android:layout_weight=".7" />

</LinearLayout>

Тут используем SelectionFragment, однако он занимает не весь экран, а только треть и, кроме того, добавили контейнер для второго фрагмента.

Так как мы теперь не добавляем SelectionFragment динамически, удалите весь связанный с ним код из onCreate() в MainActivity.

Также создайте новый эмулятор для планшета и запустите приложение.

 

При запуске приложения на телефоне все останется, как и раньше.

Задание 2. Каким образом реализовывать фрагменты, которые будут отличаться только заголовком и цветом фона?

Просто передать в одном из конструкторов заголовок и цвет нельзя. Надо использовать механизм, который называется статической инициализацией.

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

 

Вид приложения при запуске

Вид приложения при нажатии на кнопку В1

Вид приложения при нажатии на кнопку В2

Вид приложения при нажатии на кнопку В3

Выполнение работы:

1. Создадим файл dimens.xml

<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>

2. Изменим файл activity_main.xml.

3. <?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.lab4.MainActivity">

<!-- Сюда будем помещать фрагменты -->
<LinearLayout
   android:id="@+id/host"
   android:layout_width="match_parent"
   android:layout_height="0dp"
   android:orientation="vertical"
   android:layout_weight="1">
</LinearLayout>

<LinearLayout
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
   <Button
       android:id="@+id/b1"
       android:text="b1"
       android:onClick="b1Click"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />
   <Button
       android:id="@+id/b2"
       android:text="b2"
       android:onClick="b2Click"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />
   <Button
          android:id="@+id/b3"
       android:text="b3"
       android:onClick="b3Click"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>

4. Создадим файл с разметкой fragment_first.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_android:layout_height="match_parent">

<TextView
   android:text="First fragment"
   android:textSize="50sp"
   android:layout_centerInParent="true"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" />

</RelativeLayout>

5. Cоздадим класс FirstFragment

 

6. Создать файл fragment_generic.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- У лэйаута есть идентификатор, чтобы можно было поменять его цвет -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_android:layout_height="match_parent"
android:id="@+id/relative">

<TextView
   android:id="@+id/text"
   android:textSize="50sp"
   android:layout_centerInParent="true"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" />

</RelativeLayout>

 

7. Создадим класс GenericFragment со следующим содержимым:

 

Класс Bundle необходим для временного хранения данных в процессе выполнения. Это отличный выбор при передаче данных между активностями. Это способ для сохранения данных при смене ориентации экрана.

Это сохранённые данные, которые система использует для восстановления предыдущего состояния. Представляет собой набор пар ключ-значение.

 

8. Изменим код MainActivity

Алгоритм добавления нового фрагмента

private void addFragment(Fragment fragment) {
// Используем транзакцию для добавления фрагмента
// В рамках одной транзакции можно произвести
// много операций по добавлению, замене и удалению фрагментов.
// В конце требуется выполнить commit


// Создадим фрагмент

// Создадим транзакцию

// Нужно указать идентификтор лэйаута ,куда будет добавлен фрагмент

// Если хотим иметь возможность "откатить" транзакцию по кнопке Back,
// нужно добавить ее в BackStack

// Завершим транзакцию
}

// Так можно задать цвет:
// 0xccaabbcc
// Color.black

 

Kод MainActivity

Проверьте работу приложения.

Задание 3. Передача данных между фрагментами.

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

Вид приложения при запуске

Передача данных с фрагмента слева фрагменту справа

Передача данных с фрагмента справа фрагменту слева

Выполнение работы:

1. Создадим класс FirstFragment

2. Создадим файл с разметкой fragment_first.xml. Добавим строковые ресурсы.Изменим tools:context.

<LinearLayout 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"
android:orientation="vertical"
tools:context="com.example.student1.fragmentexample.FirstFragment">

<!-- TODO: Update blank fragment layout -->
<TextView
   android:id="@+id/first.data"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="@string/hello_blank_fragment" />

<EditText
   android:id="@+id/first.text"
   android:layout_width="match_parent"
   android:layout_height="wrap_content" />
<Button
   android:id="@+id/first.post"
   android:text="Послать данные"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" />

</LinearLayout>

3. Запишем код в FirstFragment

4. Создадим класс SecondFragment.

5. Cоздадим файл fragment_second.xml

<LinearLayout 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"
android:orientation="vertical"
tools:context="com.example.student1.fragmentexample.SecondFragment">

<!-- TODO: Update blank fragment layout -->
<TextView
   android:id="@+id/second.data"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="@string/hello_blank_fragment" />

<EditText
   android:id="@+id/second.text"
   android:layout_width="match_parent"
   android:layout_height="wrap_content" />
<Button
   android:id="@+id/second.post"
   android:text="Послать данные"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" />

</LinearLayout>

6. Запишем код в SecondFragment(код аналогичный)

 


Дата добавления: 2021-12-10; просмотров: 25; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!