Các phương pháp hay nhất về tương tác với bản đồ điều hướng

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 bao bọc NavigationView và tự động xử lý các lệnh gọi lại vòng đời của nó, vì vậy, bạn không cần tự quản lý các lệnh gọi lại này. Phương pháp này ít xảy ra lỗi và là cách nên dùng để sử dụng hoạt động điều hướng trong ứng dụng. Khi dùng NavigationFragment, đừng trực tiếp gọi các sự kiện trong vòng đời 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à tuân theo sát các sự kiện 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 vòng đời này được gọi. NavigationView thực thi nhiều lần khởi chạy trên NavigationView#onCreate và NavigationView#onStart, cũng như dọn dẹp trên NavigationView#onStop và NavigationView#onDestroy, cũng như khi các sự kiện khác trong vòng đời được xử lý.

Các phương thức vòng đời NavigationView có ý nghĩa tương tự như đối với các hoạt động hoặc mảnh trên Android. Ví dụ: onCreate của NavigationView được dịch 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 mảnh Android. Vì các lệnh gọi lại trong vòng đời NavigationView dựa trên và được gọi theo cùng một thứ tự như các lệnh gọi lại trong vòng đời của Android, nên bạn phải tuân thủ nghiêm ngặt thứ tự của 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 Các khái niệm về vòng đời của activity 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 các phương thức vòng đời khác sẽ được gọ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 ở 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ố lệnh gọi lại vòng đời Android này do chính ứng dụng quản lý và NavigationView được thêm vào mảnh sau khi tạo hoặc khởi động, thì ứng dụng sẽ gọi các phương thức cụ thể theo đúng thứ tự để khởi chạy Navigation SDK một cách chính xác.

Để 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ạ Navigation SDK.

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 vòng đời của hoạt động hoặc mảnh. Các phương thức này sẽ nhận các sự kiện theo thứ tự. Phương pháp này đảm bảo rằng các ứng dụng không cần điều phối giữa các mảnh và hoạt động, đồng thời không 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 dùng nữa làm vùng chứa mảnh tiêu chuẩn cho đường đi từng chặng và hiển thị bản đồ.

NavigationFragment duy trì sự 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à các hoạt động nhập mã nguồn. Tất cả chữ ký phương thức và lệnh gọi getSupportFragmentManager() vẫn 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 đây (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ữ các 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à truyền lớp trong mã Java hoặc Kotlin. Vì cả hai lớp đều mở rộng androidx.fragment.app.Fragment, hãy tiếp tục sử dụng getSupportFragmentManager() để tra cứu mảnh:

Trước đây (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 thay đổi hành vi nào khác hoặc tái cấu trúc mã của mình. NavigationFragment hỗ trợ tất cả các phương thức công khai, giao diện trình nghe và các chế độ kiểm soát giao diện người dùng tuỳ chỉnh từ SupportNavigationFragment với các chữ ký phương thức giống hệt nhau (bao gồm cả getMapAsync(), getNavigator(), setEtaCardEnabled() và setStylingOptions()).