Эта практическая работа входит в курс «Advanced Android in Kotlin». Вы получите максимальную пользу от этого курса, выполняя задания последовательно, но это не обязательно. Все практическая работа курса перечислены на целевой странице практической работы «Advanced Android in Kotlin» .
Эта практическая работа основана на работе «Реализация входа на Android с помощью FirebaseUI» . Вы можете скачать начальный код для этой практической работы, если ещё не выполнили предыдущую, но, возможно, будет полезно сначала выполнить работу « Реализация входа на Android с помощью FirebaseUI ».
Введение
Если ваше приложение поддерживает вход в систему, часто бывает полезно зарезервировать некоторые его части только для вошедших в систему пользователей. Например, вы можете зарезервировать экран настроек приложения только для вошедших в систему пользователей.
В таких случаях можно использовать условную навигацию , чтобы перенаправлять пользователей на соответствующий экран в зависимости от состояния их аутентификации.
В этой лабораторной работе вы создадите на основе существующего приложения экран настроек, который будет доступен только пользователям, вошедшим в систему. Для этой задачи вы будете использовать компоненты навигации Android .
Что вам уже следует знать
- Компонент навигации Android и его использование в приложениях Android
- Как реализовать вход в Android-приложение с помощью библиотеки FirebaseUI. Если вы не знакомы с этой концепцией, ознакомьтесь с практической работой «Реализация входа в Android с помощью FirebaseUI ».
Чему вы научитесь
- Как направлять пользователей на соответствующие экраны вашего приложения в зависимости от того, вошли ли они в систему или нет.
Что ты будешь делать?
- Обеспечьте корректную навигацию пользователей на нужный экран после успешного входа в систему.
- Запретите пользователям доступ к экрану настроек , если они не вошли в систему, и вместо этого перенаправьте их на экран входа в систему .
В предыдущей лабораторной работе вы работали над приложением, отображающим информацию об Android. Ваше приложение также позволяло пользователям входить в систему и выходить из неё. В этой лабораторной работе вы добавите экран настроек в существующее приложение. Этот экран настроек будет доступен пользователю только в том случае, если он вошел в систему.
Если пользователь не вошел в систему, то при попытке доступа к экрану настроек приложение перенаправит его на экран входа. После успешного входа пользователь вернется на тот экран настроек, к которому он изначально пытался получить доступ.


Эта практическая работа основана на работе «Реализация входа на Android с помощью FirebaseUI» . Вы можете скачать начальный код для этой практической работы, если ещё не выполнили предыдущую, но, возможно, будет полезно сначала выполнить работу « Реализация входа на Android с помощью FirebaseUI ».
Загрузить пример приложения можно одним из следующих способов:
... или клонируйте репозиторий GitHub из командной строки, используя следующую команду, и переключитесь на start ветку репозитория:
$ git clone https://github.com/googlecodelabs/android-kotlin-login-navigation
После загрузки проекта в Android Studio:
- Запустите приложение на эмуляторе или физическом устройстве, чтобы убедиться, что ваша среда успешно настроена для начала разработки.
В случае успеха вы увидите домашний экран с интересным фактом об Android и кнопкой входа в верхнем левом углу.

Текущие возможности стартового приложения:
- Если пользователь не вошел в систему, нажатие кнопки «Войти» запускает процесс входа в систему и позволяет пользователю войти в систему, используя адрес электронной почты или учетную запись Google.
- Если пользователь вошел в систему, кнопка изменится на кнопку «Выход» , которая позволит пользователю выйти из системы.
В этой задаче вам предстоит добавить на главный экран кнопку, позволяющую пользователю перейти на экран настроек. На экране настроек пользователь сможет выбрать, какие интересные факты отображать на главном экране. На экране настроек можно выбрать, что отображать: факты об Android или факты о штате Калифорния.

- Откройте
fragment_main.xml. - В
fragment_main.xml,добавьте кнопку «Настройки» , вложенную вConstraintLayout, и расположите ее в правом верхнем углу экрана.
фрагмент_main.xml
<TextView
android:id="@+id/settings_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:background="@color/colorAccent"
android:padding="10dp"
android:text="@string/settings_btn"
android:textColor="#ffffff"
android:textSize="20sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>- Откройте
nav_graph.xml. - Добавьте действие в
mainFragment.idдействия —action_mainFragment_to_customizeFragment, а назначение —customizeFragment.
nav_graph.xml
<fragment
android:id="@+id/mainFragment"
android:name="com.example.android.firebaseui_login_sample.MainFragment"
android:label="MainFragment">
<action
android:id="@+id/action_mainFragment_to_settingsFragment"
app:destination="@id/settingsFragment"/>
</fragment>- Откройте
MainFragment.kt. - В
onViewCreated()установитеonClickListenerдляsettings_btn, чтобы нажатие кнопки перенаправляло пользователя кcustomizeFragment.
MainFragment.kt
binding.settingsBtn.setOnClickListener {
val action = MainFragmentDirections.actionMainFragmentToSettingsFragment()
findNavController().navigate(action)
}- Если вы видите неразрешенные ошибки, перекомпилируйте приложение из меню «Сборка» , чтобы сгенерировать и использовать созданные вами новые действия навигации.
- Перезапустите приложение. Теперь в правом верхнем углу должна появиться функциональная кнопка «Настройки» .
- Нажмите кнопку, которая откроет экран настроек . На экране настроек есть только один параметр: пользователь может выбрать, какой тип интересных фактов он хочет видеть на главном экране.
- Нажмите кнопку «Назад» на устройстве Android, чтобы вернуться на главный экран.

В этой задаче вам предстоит добавить код, который перенаправит пользователя на экран входа в систему, если он попытается получить доступ к экрану настроек, не выполнив вход в систему.
- Откройте
SettingsFragment.kt. - В
onViewCreated()проследите заauthenticationStateи перенаправьте пользователя вLoginFragment, если он не аутентифицирован.
SettingsFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val navController = findNavController()
viewModel.authenticationState.observe(viewLifecycleOwner, Observer { authenticationState ->
when (authenticationState) {
LoginViewModel.AuthenticationState.AUTHENTICATED -> Log.i(TAG, "Authenticated")
// If the user is not logged in, they should not be able to set any preferences,
// so navigate them to the login fragment
LoginViewModel.AuthenticationState.UNAUTHENTICATED -> navController.navigate(
R.id.loginFragment
)
else -> Log.e(
TAG, "New $authenticationState state that doesn't require any UI change"
)
}
})
}Поскольку приложение перенаправляет пользователя на экран входа при попытке доступа к экрану настроек, приложению также необходимо обрабатывать поведение кнопки «Назад» на экране входа. Если приложение не настроит обработку поведения кнопки «Назад», пользователь будет застрять в бесконечном цикле попыток вернуться на экран настроек, но затем снова будет перенаправлен на экран входа.
- Откройте
LoginFragment.kt. - В
onViewCreated()обрабатывайте действия кнопки «Назад», возвращая пользователя кMainFragment.
LoginFragment.kt
// If the user presses the back button, bring them back to the home screen
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
navController.popBackStack(R.id.mainFragment, false)
}- Перезапустите приложение и убедитесь, что если вы не вошли в систему, попытки доступа к экрану настроек теперь будут перенаправлять вас на страницу входа в систему.
Хотя вы успешно перенаправили пользователя на страницу входа, вы не учли, что происходит после успешного входа, поэтому попытки входа будут выглядеть так, как будто он не работает. Вы исправите это на следующем шаге.
На данный момент вы успешно настроили свое приложение для перенаправления пользователя на экран входа в систему, если он попытается получить доступ к экрану настроек, не выполнив вход в систему.
Однако после завершения процедуры входа вы снова возвращаетесь на экран входа. Это неудобно и может сбивать с толку.
Чтобы обеспечить идеальный пользовательский опыт, приложение должно возвращать пользователя на экран настроек после успешного входа в систему.
- Все еще в
LoginFragment.kt, в любом местеonViewCreated(), наблюдайтеauthenticationStateи возвращайте пользователя обратно вSettingsFragmentпосле успешной аутентификации.
LoginFragment.kt
// Observe the authentication state so we can know if the user has logged in successfully.
// If the user has logged in successfully, bring them back to the settings screen.
// If the user did not log in successfully, display an error message.
viewModel.authenticationState.observe(viewLifecycleOwner, Observer { authenticationState ->
when (authenticationState) {
// Since our login flow is only one screen instead of multiple
// screens, we can utilize popBackStack(). If our login flow
// consisted of multiple screens, we would have to call
// popBackStack() multiple times.
LoginViewModel.AuthenticationState.AUTHENTICATED -> navController.popBackStack()
else -> Log.e(
TAG,
"Authentication state that doesn't require any UI change $authenticationState"
)
}
})- Запустите приложение еще раз и убедитесь, что теперь после успешного входа вы попадаете на страницу настроек , а не на страницу входа .
Полное приложение со всем кодом решения можно посмотреть в этом репозитории Github https://github.com/googlecodelabs/android-kotlin-login-navigation .
В этой лабораторной работе вы изучили рекомендации по созданию удобного пользовательского опыта в приложении с поддержкой входа. Наблюдая за статусом аутентификации в приложении, вы смогли определить, к каким экранам пользователь может получить доступ, и при необходимости перенаправить его на экран входа.
Дополнительную информацию о передовых методах навигации в Android можно найти на следующих ресурсах:
Документация для разработчиков Android:
Кодлабы:
Ссылки на другие практические занятия по этому курсу см. на целевой странице практических занятий по курсу Advanced Android in Kotlin.