Добавление фрагмента в рантайме
В первую очередь заменим разметку лэйаута 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!
