탐색 지도 상호작용 권장사항

이 페이지에서는 앱에서 탐색 지도와 상호작용하기 위한 권장사항을 설명합니다.

가능한 경우 NavigationView 대신 NavigationFragment 사용

NavigationFragment는 NavigationView를 래핑하고 수명 주기 콜백을 자동으로 처리하므로 직접 관리할 필요가 없습니다. 이 접근 방식은 오류가 발생할 가능성이 적으며 앱에서 탐색을 사용하는 데 권장되는 방법입니다. NavigationFragment를 사용할 때는 NavigationView 수명 주기 이벤트를 직접 호출하지 마세요.

NavigationView를 사용하는 경우 수명 주기 메서드를 호출할 때 엄격한 순서 지정 사용

NavigationView는 탐색 지도를 호스팅하고 Android 활동 및 프래그먼트와 마찬가지로 수명 주기 이벤트를 긴밀하게 따라 이러한 수명 주기 이벤트가 호출될 때 특정 작업을 실행합니다. NavigationView는 NavigationView#onCreate 및 NavigationView#onStart에서 여러 초기화를 실행하고 NavigationView#onStop 및 NavigationView#onDestroy에서 정리하며 다른 수명 주기 이벤트가 처리될 때도 실행합니다.

NavigationView 수명 주기 메서드는 Android 활동이나 프래그먼트의 수명 주기 메서드와 동일한 의미를 갖습니다. 예를 들어 NavigationView의 onCreate는 Android 활동 또는 프래그먼트의 수명 주기 콜백으로 대략 변환되며 이 콜백에 의해 호출되어야 합니다. NavigationView 수명 주기 콜백은 Android 수명 주기 콜백과 동일한 순서로 기반을 두고 호출되므로 이러한 NavigationView 메서드의 엄격한 순서가 필요합니다. 그렇지 않으면 메모리 누수, UI 오류, 위치 업데이트 안 됨 등의 문제가 발생할 수 있습니다.

Android 활동 수명 주기에 관한 자세한 내용은 Android 개발자 문서의 활동 수명 주기 개념 섹션을 참고하세요.

다음 표는 지정된 수명 주기 메서드 후에 다른 수명 주기 메서드를 호출해야 하는 시점을 보여줍니다.

수명 주기 메서드 활동 수명 주기에서 호출되는 위치 어떤 수명 주기 메서드 후에 호출되나요?
onConfigurationChanged() UI가 포그라운드에 있고 구성이 변경될 때 호출됩니다. 항상 onStart() 뒤
onTrimMemory() 활동이 백그라운드에 있을 때 호출됩니다. 항상 onPause() 뒤
onSaveInstance() 활동이 소멸되기 전에 호출됩니다. 항상 onStop() 뒤

해당 닫기 메서드를 먼저 호출하지 않고 이러한 수명 주기 메서드를 여러 번 호출하지 마세요. 또한 이러한 Android 수명 주기 콜백 중 일부가 앱 자체에서 관리되고 NavigationView가 생성 또는 시작 후 프래그먼트에 추가되는 경우 앱은 탐색 SDK를 올바르게 초기화하기 위해 적절한 순서로 특정 메서드를 호출해야 합니다.

이러한 메서드 사용에 관한 추가 안내는 Navigation SDK 데모 앱을 참고하세요.

NavigationView를 사용하는 경우 활동이나 프래그먼트에서 수명 주기 이벤트를 호출합니다(둘 다 아님).

수명 주기 메서드의 엄격한 순서를 유지하려면 순서대로 이러한 이벤트를 수신하는 활동 또는 프래그먼트 수명 주기 콜백에서 이러한 이벤트를 호출하세요. 이 접근 방식을 사용하면 앱이 프래그먼트와 활동 간에 조정할 필요가 없고 중복 호출이 발생하지 않습니다.

SupportNavigationFragment에서 NavigationFragment로 업데이트

Navigation SDK v8.0.0부터 NavigationFragment가 지원 중단된 SupportNavigationFragment를 세부 경로 안내 내비게이션 및 지도 표시의 표준 프래그먼트 컨테이너로 대체합니다.

NavigationFragment는 SupportNavigationFragment와 전체 API 패리티를 유지합니다. 앱을 업데이트하려면 XML 레이아웃 파일과 소스 코드 가져오기에서 SupportNavigationFragment를 NavigationFragment로 대체하세요. 모든 메서드 서명과 getSupportFragmentManager() 호출은 동일하게 유지됩니다.

레이아웃 XML 업데이트

레이아웃 XML 파일에서 SupportNavigationFragment을 NavigationFragment로 바꿉니다.

이전 (v7.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" />

변경 후 (v8.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()를 계속 사용하여 프래그먼트를 조회합니다.

이전 (v7.x 이하):

자바

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

변경 후 (v8.0.0 이상):

자바

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의 모든 공개 메서드, 리스너 인터페이스, 맞춤 UI 컨트롤을 동일한 메서드 시그니처 (getMapAsync(), getNavigator(), setEtaCardEnabled(), setStylingOptions() 포함)로 지원합니다.