На этой странице приведены рекомендации по взаимодействию с картой Navigation в приложении.
По возможности используйте NavigationFragment вместо NavigationView.
NavigationFragment содержит NavigationView и автоматически обрабатывает обратные вызовы жизненного цикла, поэтому вам не нужно управлять ими самостоятельно. Это менее подверженный ошибкам и рекомендуемый способ использования навигации в приложении. При использовании NavigationFragment не вызывайте события жизненного цикла NavigationView напрямую.
Если вы используете NavigationView, вызывайте методы жизненного цикла в строгом порядке.
NavigationView содержит карту Navigation и внимательно отслеживает события жизненного цикла, такие как Activity и фрагменты Android, выполняя определенные действия при вызове этих событий жизненного цикла. NavigationView выполняет несколько инициализаций в NavigationView#onCreate и NavigationView#onStart, а также очистку в NavigationView#onStop и NavigationView#onDestroy. Кроме того, он обрабатывает другие события жизненного цикла.
Методы жизненного цикла NavigationView имеют то же значение, что и для действий или фрагментов Android. Например, метод onCreate класса NavigationView примерно соответствует методу onStart() и должен вызываться обратными вызовами жизненного цикла из действия или фрагмента Android. Поскольку обратные вызовы жизненного цикла NavigationView основаны на обратных вызовах жизненного цикла Android и вызываются в том же порядке, требуется строгое упорядочение этих методов NavigationView. В противном случае могут возникнуть утечки памяти, ошибки интерфейса, проблемы с обновлением местоположения и другие неполадки.
Дополнительную информацию о жизненном цикле объекта activity в Android можно найти в разделе Основные понятия жизненного цикла объекта activity документации для разработчиков Android.
В таблице ниже показано, когда следует вызывать другие методы жизненного цикла после указанных методов жизненного цикла:
| Метод жизненного цикла | Вызывается на этапе жизненного цикла объекта activity | После какого метода жизненного цикла вызывается |
|---|---|---|
onConfigurationChanged()
|
Вызывается, когда интерфейс находится на переднем плане и конфигурация меняется. | Всегда после onStart()
|
onTrimMemory()
|
Вызывается, когда действие выполняется в фоновом режиме. | Всегда после onPause()
|
onSaveInstance()
|
Вызывается перед удалением действия. | Всегда после onStop()
|
Не вызывайте эти методы жизненного цикла несколько раз, не вызвав сначала соответствующий метод закрытия. Кроме того, если некоторые из этих обратных вызовов жизненного цикла Android управляются самим приложением, а NavigationView добавляется во фрагмент после создания или запуска, приложение должно вызывать определенные методы в правильном порядке, чтобы правильно инициализировать Navigation SDK.
Дополнительные инструкции по использованию этих методов можно найти в демо-приложении Navigation SDK.
Если вы используете NavigationView, вызывайте события жизненного цикла из объекта Activity или фрагмента, но не из обоих.
Чтобы сохранить строгий порядок методов жизненного цикла, вызывайте эти события из обратных вызовов жизненного цикла объекта activity или фрагмента, которые получают эти события по порядку. Это позволяет избежать дублирования вызовов.
Обновление с SupportNavigationFragment до NavigationFragment
Начиная с Navigation SDK версии 8.0.0, NavigationFragment заменяет устаревший SupportNavigationFragment в качестве стандартного контейнера фрагментов для пошаговой навигации и отображения карты.
NavigationFragment полностью совместим с API SupportNavigationFragment.
Чтобы обновить приложение, замените SupportNavigationFragment на NavigationFragment в XML-файлах макета и импортируемом исходном коде. Все сигнатуры методов и вызовы getSupportFragmentManager() остаются прежними.
Обновите XML-файл макета
Замените SupportNavigationFragment на NavigationFragment в XML-файлах макета:
До (версия 7.x и более ранние):
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/navigation_fragment"
android:name="com.google.android.libraries.navigation.SupportNavigationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
После (версия 8.0.0 и более поздние):
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/navigation_fragment"
android:name="com.google.android.libraries.navigation.NavigationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Если в вашем приложении используется FragmentContainerView (рекомендуется для размещения фрагментов), обновите атрибут android:name:
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/navigation_fragment"
android:name="com.google.android.libraries.navigation.NavigationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Обновите код приложения
Замените импортированные элементы и приведения классов в коде Java или Kotlin. Поскольку оба класса расширяют androidx.fragment.app.Fragment, продолжайте использовать getSupportFragmentManager() для поиска фрагмента:
До (версия 7.x и более ранние):
Java
import com.google.android.libraries.navigation.SupportNavigationFragment; public class MainActivity extends AppCompatActivity { private SupportNavigationFragment mNavFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNavFragment = (SupportNavigationFragment) getSupportFragmentManager() .findFragmentById(R.id.navigation_fragment); } }
Kotlin
import com.google.android.libraries.navigation.SupportNavigationFragment class MainActivity : AppCompatActivity() { private lateinit var navFragment: SupportNavigationFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navFragment = supportFragmentManager .findFragmentById(R.id.navigation_fragment) as SupportNavigationFragment } }
После (версия 8.0.0 и более поздние):
Java
import com.google.android.libraries.navigation.NavigationFragment; public class MainActivity extends AppCompatActivity { private NavigationFragment mNavFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNavFragment = (NavigationFragment) getSupportFragmentManager() .findFragmentById(R.id.navigation_fragment); } }
Kotlin
import com.google.android.libraries.navigation.NavigationFragment class MainActivity : AppCompatActivity() { private lateinit var navFragment: NavigationFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navFragment = supportFragmentManager .findFragmentById(R.id.navigation_fragment) as NavigationFragment } }
Паритет API
Вам не нужно менять поведение или структуру кода.
NavigationFragment поддерживает все общедоступные методы, интерфейсы прослушивателей и настраиваемые элементы управления пользовательского интерфейса из SupportNavigationFragment с идентичными сигнатурами методов (включая getMapAsync(), getNavigator(), setEtaCardEnabled() и setStylingOptions()).