Рекомендации по взаимодействию с навигационными картами

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

По возможности используйте NavigationFragment вместо NavigationView .

NavigationFragment оборачивает NavigationView и автоматически обрабатывает его коллбэки жизненного цикла, поэтому вам не нужно управлять ими самостоятельно. Такой подход менее подвержен ошибкам и является рекомендуемым способом использования навигации в вашем приложении. При использовании NavigationFragment не следует вызывать события жизненного цикла NavigationView напрямую.

При использовании NavigationView применяйте строгий порядок вызова методов жизненного цикла.

NavigationView содержит карту навигации и внимательно отслеживает события жизненного цикла, как и другие активности и фрагменты Android, выполняя определенные действия при возникновении этих событий. NavigationView выполняет множественную инициализацию в NavigationView#onCreate и NavigationView#onStart , а также очистку в NavigationView#onStop и NavigationView#onDestroy , а также при обработке других событий жизненного цикла.

Методы жизненного цикла NavigationView имеют то же значение, что и для Android-активностей или фрагментов. Например, onCreate NavigationView примерно соответствует и должен вызываться коллбэками жизненного цикла из Android-активности или фрагмента. Поскольку коллбэки жизненного цикла NavigationView основаны на том же порядке и вызываются в том же порядке, что и коллбэки жизненного цикла Android, требуется строгий порядок вызова этих методов NavigationView . В противном случае вы можете столкнуться с утечками памяти , ошибками пользовательского интерфейса, некорректным обновлением местоположения и другими проблемами.

Для получения дополнительной информации о жизненном цикле активности Android см. раздел « Концепции жизненного цикла активности» в документации для разработчиков Android.

В следующей таблице показано, когда следует вызывать другие методы жизненного цикла после указанных методов жизненного цикла:

Метод жизненного цикла Место вызова в жизненном цикле активности Вызывается после какого метода жизненного цикла
onConfigurationChanged() Вызывается, когда пользовательский интерфейс находится на переднем плане и изменяется конфигурация. Всегда после onStart()
onTrimMemory() Вызывается, когда какое-либо действие выполняется в фоновом режиме. Всегда после onPause()
onSaveInstance() Вызывается перед уничтожением активности. Всегда после onStop()

Не вызывайте эти методы жизненного цикла несколько раз, не вызвав предварительно соответствующий метод закрытия. Кроме того, имейте в виду, что если некоторые из этих коллбэков жизненного цикла Android управляются самим приложением, и NavigationView добавляется во фрагмент после создания или запуска, приложение должно вызывать соответствующие методы в правильном порядке для корректной инициализации SDK навигации.

Дополнительные инструкции по использованию этих методов см. в демонстрационном приложении Navigation SDK .

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

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

Обновить с SupportNavigationFragment на NavigationFragment

Начиная с версии Navigation SDK v8.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);
  }
}
    

Котлин

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);
  }
}
    

Котлин

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() ).