이 페이지에서는 앱에서 내비게이션 지도와 상호작용하기 위한 권장사항을 설명합니다.
가능하면 NavigationView 대신 NavigationFragment를 사용하세요.
NavigationFragment는 NavigationView를 래핑하고 수명 주기 콜백을 자동으로 처리하므로 직접 관리할 필요가 없습니다. 이 접근 방식은 오류가 발생할 가능성이 적으며 앱에서 탐색을 사용하는 데 권장되는 방법입니다. NavigationFragment를 사용할 때는 NavigationView 수명 주기 이벤트를 직접 호출하지 마세요.
NavigationView를 사용하는 경우 수명 주기 메서드를 호출할 때 엄격한 순서 사용
NavigationView는 Navigation 지도를 호스팅하고 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가 생성 또는 시작 후 프래그먼트에 추가되는 경우 앱은 Navigation SDK를 올바르게 초기화하기 위해 적절한 순서로 특정 메서드를 호출해야 합니다.
이러한 메서드 사용에 관한 추가 안내는 Navigation SDK 데모 앱을 참고하세요.
NavigationView를 사용하는 경우 활동 또는 프래그먼트에서 수명 주기 이벤트를 호출합니다(둘 다에서 호출하지 않음).
수명 주기 메서드의 엄격한 순서를 유지하려면 이러한 이벤트를 순서대로 수신하는 활동 또는 프래그먼트 수명 주기 콜백에서 이러한 이벤트를 호출합니다. 이 접근 방식을 사용하면 앱이 프래그먼트와 활동 간에 조정할 필요가 없고 중복 호출이 발생하지 않습니다.
SupportNavigationFragment에서 NavigationFragment(으)로 업데이트
Navigation SDK v8.0.0부터 NavigationFragment는 세부 경로 안내 내비게이션 및 지도 표시를 위한 표준 프래그먼트 컨테이너로 지원 중단된 SupportNavigationFragment를 대체합니다.
NavigationFragment는 SupportNavigationFragment와 완전한 API 패리티를 유지합니다.
앱을 업데이트하려면 XML 레이아웃 파일 및 소스 코드 가져오기에서 SupportNavigationFragment를 NavigationFragment로 바꿉니다. 모든 메서드 서명과 getSupportFragmentManager() 호출은 동일하게 유지됩니다.
레이아웃 XML 업데이트
thought
레이아웃 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는 동일한 메서드 서명 (getMapAsync(), getNavigator(), setEtaCardEnabled(), setStylingOptions() 포함)을 사용하여 SupportNavigationFragment의 모든 공개 메서드, 리스너 인터페이스, 맞춤 UI 컨트롤을 지원합니다.