xmlns:android="http://schemas.android.c
om/apk/res/android"
xmlns:tools="http://schemas.android.com
/tools"
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PhotoGalleryActivity"/>
В файле
PhotoGalleryActivity.kt
измените код
функции
onCreate(...)
, чтобы проверить, разместился ли
фрагмент в контейнере. Если нет, создайте экземпляр
PhotoGalleryFragment
и добавьте его в контейнер (на
ошибку пока внимания не обращаем. Она исчезнет после
создания класса
PhotoGalleryFragment
).
Листинг 24.2. Настройка activity (PhotoGalleryActivity.kt)
class
PhotoGalleryActivity
:
AppCompatActivity() {
override fun onCreate(savedInstanceState:
Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_photo_
gallery)
val isFragmentContainerEmpty =
savedInstanceState == null
if (isFragmentContainerEmpty) {
supportFragmentManager
.beginTransaction()
.add(R.id.fragmentContainer,
PhotoGalleryFragment.newInstance())
.commit()
}
}
}
В приложении CriminalIntent мы проверяли размещение
фрагмента
в
контейнере
путем
вызова
функции
findFragmentById(...)
на идентификаторе контейнера
фрагмента. Эта проверка была необходима, так как менеджер
фрагментов автоматически создает и добавляет размещаемые
фрагменты обратно в activity после изменения конфигурации
или после завершения процесса системой. Добавление
фрагмента в контейнер необходимо только в том случае, если
фрагмента там еще нет.
В приложении PhotoGalleryActivity используется другой
способ определения, размещен ли фрагмент: проверка на не-
null
значения пакета
saveInstanceState
в
onCreate(...)
.
Напомним, что если пакет равен
null
, то это новый запуск
activity, и можно смело предположить, что ни один фрагмент
еще не был автоматически восстановлен и переустановлен.
Если пакет не
null
, это означает, что activity восстанавливается
после уничтожения системы (например, после поворота или
уничтожения процесса), и все фрагменты, которые были
размещены до уничтожения, были восстановлены и добавлены
обратно в соответствующие контейнеры.
Если надо выяснить, находится ли фрагмент в единственном
контейнере activity, работает любой из подходов. Какой из них
использовать — вопрос личных предпочтений.
Проверка
saveInstanceState
позволяет использовать
информацию, которая у вас уже есть, чтобы определить,
размещен ли фрагмент. Однако в этом случае предполагается,
что читатель вашего кода понимает, как работает
saveInstanceState
и восстановление фрагмента после
изменения конфигурации.
Проверка
существования
фрагмента
с
помощью
supportFragmentManager.findFragmentById(R.id.fragm
ent_container)
для новичков в Android более понятна и
проста для чтения. Однако если фрагмент уже существует в
контейнере, предполагается неоправданное взаимодействие с
менеджером фрагментов.
Теперь надо настроить представление фрагмента.
Приложение PhotoGallery будет отображать свои результаты в
RecyclerView
, используя встроенный
GridLayoutManager
,
который расположит элементы в сетке. Сначала нужно
добавить библиотеку
RecyclerView
в качестве зависимости,
как это было сделано в главе 9. Откройте файл
build.gradle
модуля приложения и добавьте зависимость от Gradle для
представления утилизатора (листинг 24.3). После внесения этих
изменений синхронизируйте файл Gradle с помощью подсказки
Android Studio.
Do'stlaringiz bilan baham: |