Trang này giải thích các phương pháp hay nhất để tương tác với bản đồ Điều hướng trong ứng dụng của bạn.
Sử dụng NavigationFragment thay vì NavigationView bất cứ khi nào có thể
NavigationFragment gói NavigationView và tự động xử lý các phương thức gọi lại trong vòng đời của nó, vì vậy, bạn không cần phải tự quản lý các phương thức gọi lại này. Phương pháp này ít xảy ra lỗi hơn và là cách nên dùng để sử dụng tính năng điều hướng trong ứng dụng. Khi sử dụng NavigationFragment, đừng gọi trực tiếp các sự kiện trong vòng đời của NavigationView.
Nếu sử dụng NavigationView, hãy sử dụng thứ tự nghiêm ngặt khi gọi các phương thức trong vòng đời
NavigationView lưu trữ bản đồ Điều hướng và theo dõi chặt chẽ các sự kiện trong vòng đời dưới dạng các hoạt động và mảnh Android, thực hiện các hành động cụ thể khi các sự kiện trong vòng đời này được gọi. NavigationView thực thi nhiều hoạt động khởi chạy
trên NavigationView#onCreate và NavigationView#onStart, đồng thời dọn dẹp trên
NavigationView#onStop và NavigationView#onDestroy, cũng như khi các
sự kiện trong vòng đời khác được xử lý.
Các phương thức vòng đời của NavigationView có ý nghĩa tương tự như các phương thức vòng đời của hoạt động hoặc mảnh Android. Ví dụ: onCreate của NavigationView được dịch gần đúng và phải được gọi bằng các phương thức gọi lại trong vòng đời từ Hoạt động hoặc fragment Android. Vì các phương thức gọi lại trong vòng đời của NavigationView dựa trên và được gọi theo cùng thứ tự với các phương thức gọi lại trong vòng đời của Android, nên bạn phải sắp xếp thứ tự nghiêm ngặt cho các phương thức NavigationView này. Nếu không, bạn có thể gặp phải tình trạng rò rỉ bộ nhớ, lỗi giao diện người dùng, vị trí không được cập nhật và các vấn đề khác.
Để biết thêm thông tin về vòng đời của activity Android, hãy xem phần Khái niệm về vòng đời hoạt động trong tài liệu dành cho nhà phát triển Android.
Bảng sau đây cho biết thời điểm nên gọi các phương thức khác trong vòng đời, sau các phương thức vòng đời được chỉ định:
| Phương thức vòng đời | Được gọi ở đâu trong vòng đời của activity | Được gọi sau phương thức vòng đời nào |
|---|---|---|
onConfigurationChanged()
|
Được gọi khi giao diện người dùng ở nền trước và cấu hình thay đổi. | Luôn sau onStart()
|
onTrimMemory()
|
Được gọi khi một hoạt động đang chạy ở chế độ nền. | Luôn sau onPause()
|
onSaveInstance()
|
Được gọi trước khi một hoạt động bị huỷ. | Luôn sau onStop()
|
Đừng gọi các phương thức vòng đời này nhiều lần mà không gọi phương thức đóng tương ứng trước. Ngoài ra, hãy lưu ý rằng nếu một số phương thức gọi lại trong vòng đời Android này do chính ứng dụng quản lý và NavigationView được thêm vào fragment sau khi tạo hoặc bắt đầu, thì ứng dụng phải gọi các phương thức cụ thể theo đúng thứ tự để khởi động SDK Điều hướng đúng cách.
Để biết thêm hướng dẫn về cách sử dụng các phương thức này, hãy xem ứng dụng minh hoạ SDK điều hướng.
Nếu sử dụng NavigationView, hãy gọi các sự kiện trong vòng đời từ hoạt động hoặc mảnh, chứ không phải cả hai
Để duy trì thứ tự nghiêm ngặt của các phương thức vòng đời, hãy gọi các sự kiện này từ phương thức gọi lại trong vòng đời của hoạt động hoặc fragment, nhận các sự kiện này theo thứ tự. Phương pháp này đảm bảo rằng các ứng dụng không cần phối hợp giữa các mảnh và hoạt động, đồng thời gây ra các lệnh gọi trùng lặp.
Cập nhật từ SupportNavigationFragment lên NavigationFragment
Kể từ Navigation SDK phiên bản 8.0.0, NavigationFragment sẽ thay thế SupportNavigationFragment không còn được dùng nữa để làm vùng chứa mảnh tiêu chuẩn cho tính năng đường đi từng chặng và hiển thị bản đồ.
NavigationFragment duy trì tính tương đương hoàn toàn về API với SupportNavigationFragment.
Để cập nhật ứng dụng, hãy thay thế SupportNavigationFragment bằng NavigationFragment trong tệp bố cục XML và mã nguồn nhập. Tất cả chữ ký phương thức và lệnh gọi getSupportFragmentManager() đều giữ nguyên.
Cập nhật XML bố cục
Thay thế SupportNavigationFragment bằng NavigationFragment trong các tệp XML bố cục:
Trước (phiên bản 7.x trở xuống):
<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" />
Sau (phiên bản 8.0.0 trở lên):
<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" />
Nếu ứng dụng của bạn sử dụng FragmentContainerView (nên dùng để lưu trữ mảnh), hãy cập nhật thuộc tính 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" />
Cập nhật mã xử lý ứng dụng
Thay thế các lệnh nhập và ép kiểu lớp trong mã Java hoặc Kotlin. Vì cả hai lớp đều mở rộng androidx.fragment.app.Fragment, nên hãy tiếp tục sử dụng getSupportFragmentManager() để tra cứu mảnh:
Trước (phiên bản 7.x trở xuống):
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 } }
Sau (phiên bản 8.0.0 trở lên):
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 } }
Tính tương đương của API
Bạn không cần thực hiện bất kỳ thay đổi nào khác về hành vi hoặc tái cấu trúc mã.
NavigationFragment hỗ trợ tất cả các phương thức công khai, giao diện trình nghe và thành phần điều khiển trên giao diện người dùng tuỳ chỉnh từ SupportNavigationFragment có chữ ký phương thức giống hệt nhau (bao gồm getMapAsync(), getNavigator(), setEtaCardEnabled() và setStylingOptions()).