Khi sử dụng SDK Điều hướng cho Android, bạn có thể sửa đổi trải nghiệm người dùng bằng bản đồ của mình bằng cách xác định thành phần điều khiển trên giao diện người dùng và phần tử giao diện người dùng tích hợp sẵn nào sẽ xuất hiện trên bản đồ. Bạn cũng có thể điều chỉnh giao diện của giao diện người dùng điều hướng. Hãy tham khảo trang Chính sách để biết các nguyên tắc về những nội dung sửa đổi được chấp nhận đối với giao diện người dùng điều hướng.
Tài liệu này mô tả cách sửa đổi giao diện người dùng của bản đồ theo hai cách:
Thành phần điều khiển trên giao diện người dùng của bản đồ
Để đặt các phần tử trên giao diện người dùng tuỳ chỉnh trên chế độ xem thông tin chỉ đường, hãy sử dụng các thành phần điều khiển trên giao diện người dùng của Bản đồ để định vị chính xác. Khi bố cục tích hợp thay đổi, SDK Điều hướng dành cho Android sẽ tự động đặt lại vị trí các chế độ điều khiển tuỳ chỉnh của bạn.
Bạn có thể đặt một chế độ xem điều khiển tuỳ chỉnh tại một thời điểm cho mỗi vị trí. Nếu thiết kế của bạn yêu cầu nhiều phần tử trên giao diện người dùng, bạn có thể đặt các phần tử đó vào một ViewGroup rồi truyền phần tử đó vào phương thức setCustomControl.
Phương thức setCustomControl cung cấp các vị trí như được xác định trong enum CustomControlPosition:
SECONDARY_HEADER(chỉ xuất hiện ở chế độ chân dung)BOTTOM_START_BELOWBOTTOM_END_BELOWFOOTER
Thêm chế độ điều khiển tuỳ chỉnh
- Tạo Khung hiển thị Android bằng phần tử trên giao diện người dùng tuỳ chỉnh hoặc ViewGroup.
- Tăng cường XML hoặc tạo thực thể cho chế độ xem tuỳ chỉnh để lấy một thực thể của chế độ xem.
Sử dụng
NavigationView.setCustomControlhoặcNavigationFragment.setCustomControlvới vị trí điều khiển tuỳ chỉnh đã chọn từ enumCustomControlPosition.Ví dụ sau đây tạo một mảnh và thêm một chế độ điều khiển tuỳ chỉnh vào vị trí tiêu đề phụ.
mNavFragment.setCustomControl(getLayoutInflater(). inflate(R.layout.your_custom_control, null), CustomControlPosition.SECONDARY_HEADER); ```
Xoá chế độ điều khiển tuỳ chỉnh
Để xoá một thành phần điều khiển tuỳ chỉnh, hãy gọi phương thức setCustomControl bằng tham số chế độ xem null và vị trí thành phần điều khiển tuỳ chỉnh đã chọn.
Ví dụ: đoạn mã sau đây xoá mọi tiêu đề phụ tuỳ chỉnh và trả về nội dung mặc định:
mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);
Vị trí điều khiển tuỳ chỉnh
Tiêu đề phụ
Để sử dụng vị trí điều khiển tuỳ chỉnh này, hãy truyền vị trí CustomControlPosition.SECONDARY_HEADER đến setCustomControl.
Theo mặc định, bố cục màn hình ở chế độ thao tác cung cấp vị trí cho tiêu đề phụ nằm bên dưới tiêu đề chính. Tiêu đề phụ này xuất hiện khi cần thiết, chẳng hạn như khi có hướng dẫn về làn đường. Ứng dụng của bạn có thể sử dụng vị trí tiêu đề phụ này của bố cục cho nội dung tuỳ chỉnh. Khi bạn sử dụng tính năng này, quyền kiểm soát của bạn sẽ áp dụng cho mọi nội dung tiêu đề phụ mặc định. Nếu khung hiển thị điều hướng của bạn có nền, thì nền đó sẽ giữ nguyên vị trí và được tiêu đề phụ che phủ. Khi ứng dụng của bạn xoá chế độ điều khiển tuỳ chỉnh, mọi tiêu đề phụ mặc định đều có thể xuất hiện ở vị trí của chế độ điều khiển đó.
Vị trí tiêu đề phụ tuỳ chỉnh căn chỉnh cạnh trên cùng với cạnh dưới cùng của tiêu đề chính. Vị trí này chỉ được hỗ trợ trong portrait mode. Trong landscape mode, tiêu đề phụ không có sẵn và bố cục không thay đổi.
Bắt đầu từ dưới lên
Để sử dụng vị trí điều khiển tuỳ chỉnh này, hãy truyền vị trí CustomControlPosition.BOTTOM_START_BELOW đến setCustomControl.
Vị trí điều khiển tuỳ chỉnh này nằm ở góc dưới cùng bên trái của bản đồ. Trong cả portrait mode và landscape mode, thành phần này nằm phía trên thẻ ETA và/hoặc chân trang tuỳ chỉnh (hoặc dọc theo cuối bản đồ nếu không có thành phần nào), còn các thành phần của SDK Điều hướng (bao gồm cả nút căn giữa và biểu trưng Google) sẽ di chuyển lên trên để phù hợp với chiều cao của chế độ xem điều khiển tuỳ chỉnh. Chế độ điều khiển này nằm trong ranh giới hiển thị của bản đồ, vì vậy, mọi khoảng đệm được thêm vào cạnh dưới hoặc cạnh bắt đầu của bản đồ cũng sẽ thay đổi vị trí của chế độ điều khiển này.
Điểm cuối dưới cùng
Để sử dụng vị trí điều khiển tuỳ chỉnh này, hãy truyền vị trí CustomControlPosition.BOTTOM_END_BELOW đến setCustomControl.
Vị trí điều khiển tuỳ chỉnh này nằm ở góc dưới cùng của bản đồ. Trong portrait mode, nút này nằm phía trên thẻ ETA và/hoặc chân trang tuỳ chỉnh (hoặc dọc theo cuối bản đồ nếu không có cả hai), nhưng trong landscape mode, nút này được căn chỉnh với cuối bản đồ. Mọi phần tử SDK điều hướng hiển thị dọc theo cạnh cuối (bên phải trong LTR) sẽ di chuyển lên để tính đến chiều cao của chế độ xem điều khiển tuỳ chỉnh. Thành phần điều khiển này nằm trong ranh giới hiển thị của bản đồ, vì vậy, mọi khoảng đệm được thêm vào cạnh dưới hoặc cạnh cuối của bản đồ cũng sẽ thay đổi vị trí của thành phần điều khiển này.
Footer
Để sử dụng vị trí điều khiển tuỳ chỉnh này, hãy truyền vị trí CustomControlPosition.FOOTER đến setCustomControl.
Vị trí điều khiển tuỳ chỉnh này được thiết kế cho chế độ xem chân trang tuỳ chỉnh. Nếu thẻ ETA của SDK Điều hướng hiển thị, thì thành phần điều khiển này sẽ nằm phía trên thẻ đó. Nếu không, thành phần điều khiển sẽ được căn chỉnh với phần dưới cùng của bản đồ. Không giống như các chế độ điều khiển tuỳ chỉnh BOTTOM_START_BELOW và BOTTOM_END_BELOW, chế độ điều khiển này được đặt bên ngoài ranh giới bản đồ hiển thị, tức là mọi khoảng đệm được thêm vào bản đồ sẽ không thay đổi vị trí của chế độ điều khiển này.
Trong portrait mode, chân trang tuỳ chỉnh có chiều rộng đầy đủ. Các chế độ điều khiển tuỳ chỉnh ở cả vị trí CustomControlPosition.BOTTOM_START_BELOW và CustomControlPosition.BOTTOM_END_BELOW, cũng như các thành phần trên giao diện người dùng của SDK Điều hướng như nút căn giữa và biểu trưng Google, đều được đặt phía trên chân trang của chế độ điều khiển tuỳ chỉnh. Vị trí mặc định của chữ V sẽ tính đến chiều cao tuỳ chỉnh của chân trang.
Trong landscape mode, chân trang tuỳ chỉnh có chiều rộng bằng một nửa và được căn chỉnh theo phía bắt đầu (phía bên trái trong LTR), giống như thẻ ETA của SDK Điều hướng. Các chế độ điều khiển tuỳ chỉnh ở vị trí CustomControlPosition.BOTTOM_START_BELOW và các phần tử trên giao diện người dùng của SDK điều hướng như nút căn giữa và biểu trưng Google được đặt phía trên chân trang của chế độ điều khiển tuỳ chỉnh. Các nút điều khiển tuỳ chỉnh ở vị trí CustomControlPosition.BOTTOM_END_BELOW và mọi phần tử trên giao diện người dùng của SDK Điều hướng dọc theo cạnh cuối (bên phải trong LTR) vẫn được căn chỉnh với phần dưới cùng của bản đồ. Vị trí mặc định của chữ V không thay đổi khi có chân trang tuỳ chỉnh vì chân trang không kéo dài đến cạnh cuối của bản đồ.
Các chế độ điều khiển tuỳ chỉnh ở vị trí CustomControlPosition.BOTTOM_START_BELOW và CustomControlPosition.BOTTOM_END_BELOW, cũng như các phần tử trên giao diện người dùng của SDK điều hướng như nút căn giữa và biểu trưng Google được đặt phía trên chân trang của chế độ điều khiển tuỳ chỉnh.
Phụ kiện giao diện người dùng của bản đồ
Navigation SDK cho Android cung cấp các phụ kiện giao diện người dùng xuất hiện trong quá trình điều hướng, tương tự như các phụ kiện trong ứng dụng Google Maps cho Android. Bạn có thể điều chỉnh chế độ hiển thị hoặc giao diện của các chế độ điều khiển này như mô tả trong phần này. Những thay đổi bạn thực hiện ở đây sẽ được áp dụng trong phiên đi theo chỉ dẫn tiếp theo.
Tham khảo trang Chính sách để biết nguyên tắc về các nội dung sửa đổi được chấp nhận đối với giao diện người dùng điều hướng.
Xem mã
Lối vào và điểm đến được làm nổi bật
Khi một điểm đến được tạo bằng placeID, toà nhà của điểm đến sẽ được làm nổi bật và biểu tượng lối vào sẽ xuất hiện (bất cứ khi nào có thể). Những dấu hiệu trực quan này giúp người dùng phân biệt và di chuyển đến
điểm đến của họ.
Để tạo một đích đến bằng placeID, hãy sử dụng phương thức Waypoint.Builder.setPlaceIdString().

Sửa đổi tiêu đề điều hướng

Sử dụng
NavigationFragment.setStylingOptions()
hoặc
NavigationView.setStylingOptions()
để thay đổi giao diện của tiêu đề điều hướng và chỉ báo rẽ tiếp theo
xuất hiện bên dưới tiêu đề khi có sẵn.
Bạn có thể đặt các thuộc tính sau:
| Loại thuộc tính | Thuộc tính |
|---|---|
| Màu nền |
|
| Phần tử văn bản cho hướng dẫn |
|
| Các phần tử văn bản cho các bước tiếp theo |
|
| Biểu tượng thao tác |
|
| Hướng dẫn làn đường |
|
Ví dụ sau đây cho thấy cách đặt các tuỳ chọn tạo kiểu:
private NavigationFragment mNavFragment;
mNavFragment = (NavigationFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_fragment);
// Set the styling options on the fragment.
mNavFragment.setStylingOptions(new StylingOptions()
.primaryDayModeThemeColor(0xff1A237E)
.secondaryDayModeThemeColor(0xff3F51B5)
.primaryNightModeThemeColor(0xff212121)
.secondaryNightModeThemeColor(0xff424242)
.headerLargeManeuverIconColor(0xffffff00)
.headerSmallManeuverIconColor(0xffffa500)
.headerNextStepTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
.headerNextStepTextColor(0xff00ff00)
.headerNextStepTextSize(20f)
.headerDistanceTypefacePath("/system/fonts/NotoSerif-Italic.ttf")
.headerDistanceValueTextColor(0xff00ff00)
.headerDistanceUnitsTextColor(0xff0000ff)
.headerDistanceValueTextSize(20f)
.headerDistanceUnitsTextSize(18f)
.headerInstructionsTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
.headerInstructionsTextColor(0xffffff00)
.headerInstructionsFirstRowTextSize(24f)
.headerInstructionsSecondRowTextSize(20f)
.headerGuidanceRecommendedLaneColor(0xffffa500));
Tắt lớp giao thông
Sử dụng GoogleMap.setTrafficEnabled() để bật hoặc tắt lớp lưu lượng truy cập trên bản đồ. Chế độ cài đặt này ảnh hưởng đến
các chỉ báo về mật độ giao thông hiển thị trên toàn bộ bản đồ. Tuy nhiên, việc này không ảnh hưởng đến thông tin chỉ dẫn về tình hình giao thông trên tuyến đường do trình điều hướng vạch ra.
private GoogleMap mMap;
// Get the map, and when the async call returns, setTrafficEnabled
// (callback will be on the UI thread)
mMap = mNavFragment.getMapAsync(navMap -> navMap.setTrafficEnabled(false));
Đèn giao thông và biển báo dừng

Trong khi chỉ đường, bản đồ sẽ hiển thị đèn giao thông và biển báo dừng để cung cấp cho người dùng thêm thông tin về tuyến đường và các thao tác sắp tới. Kể từ phiên bản 8.0.0, bạn không thể tắt tính năng này.
Thêm điểm đánh dấu tuỳ chỉnh
Navigation SDK cho Android hiện sử dụng API Google Maps cho điểm đánh dấu. Hãy truy cập vào tài liệu về API Maps để biết thêm thông tin.
Văn bản nổi
Bạn có thể thêm văn bản nổi ở bất cứ đâu trong ứng dụng, miễn là văn bản đó không che mất thông tin ghi nhận tác giả của Google. Navigation SDK không hỗ trợ việc neo văn bản vào một vĩ độ/kinh độ trên bản đồ hoặc vào một nhãn. Hãy chuyển đến phần Cửa sổ thông tin để biết thêm thông tin.
Hiển thị giới hạn tốc độ
Bạn có thể hiện hoặc ẩn biểu tượng giới hạn tốc độ theo phương thức lập trình. Sử dụng NavigationView.setSpeedLimitIconEnabled() hoặc NavigationFragment.setSpeedLimitIconEnabled() để hiện hoặc ẩn biểu tượng giới hạn tốc độ. Khi bạn bật tính năng này, biểu tượng giới hạn tốc độ sẽ xuất hiện ở góc dưới cùng trong khi chỉ đường. Biểu tượng này cho biết giới hạn tốc độ
của tuyến đường mà xe đang di chuyển. Biểu tượng này chỉ xuất hiện ở những vị trí
có dữ liệu đáng tin cậy về giới hạn tốc độ.
// Display the Speed Limit icon
mNavFragment.setSpeedLimitIconEnabled(true);
Biểu tượng giới hạn tốc độ sẽ tạm thời bị ẩn khi nút căn giữa xuất hiện.
Đặt chế độ ban đêm
Bạn có thể kiểm soát hành vi của chế độ ban đêm theo phương thức lập trình. Sử dụng NavigationView.setForceNightMode() hoặc NavigationFragment.setForceNightMode() để bật hoặc tắt chế độ ban đêm, hoặc cho phép SDK Điều hướng cho Android kiểm soát chế độ này.
AUTOCho phép SDK Điều hướng xác định chế độ phù hợp theo vị trí thiết bị và giờ địa phương.FORCE_NIGHTbuộc bật chế độ ban đêm.FORCE_DAYbuộc bật chế độ ban ngày.
Ví dụ sau đây cho thấy cách buộc bật chế độ ban đêm trong một mảnh điều hướng:
// Force night mode on.
mNavFragment.setForceNightMode(FORCE_NIGHT);
Hiển thị danh sách đường đi
Trước tiên, hãy tạo khung hiển thị và thêm khung hiển thị đó vào hệ phân cấp.
void setupDirectionsListView() {
// Create the view.
DirectionsListView directionsListView = new DirectionsListView(getApplicationContext());
// Add the view to your view hierarchy.
ViewGroup group = findViewById(R.id.directions_view);
group.addView(directionsListView);
// Add a button to your layout to close the directions list view.
ImageButton button = findViewById(R.id.close_directions_button); // this button is part of the container we hide in the next line.
button.setOnClickListener(
v -> findViewById(R.id.directions_view_container).setVisibility(View.GONE));
}
Hãy nhớ chuyển tiếp các sự kiện trong vòng đời đến DirectionsListView giống như với NavigationView. Ví dụ:
protected void onResume() {
super.onResume();
directionsListView.onResume();
}
Ẩn các tuyến đường thay thế
Khi giao diện người dùng trở nên lộn xộn với quá nhiều thông tin, bạn có thể giảm bớt sự lộn xộn bằng cách hiển thị ít tuyến đường thay thế hơn so với mặc định (hai) hoặc không hiển thị tuyến đường thay thế nào. Bạn có thể định cấu hình lựa chọn này trước khi tìm nạp tuyến đường bằng cách gọi phương thức RoutingOptions.alternateRoutesStrategy() với một trong các giá trị enum sau:
| Giá trị enum | Mô tả |
|---|---|
| AlternateRoutesStrategy.SHOW_ALL | Mặc định. Hiển thị tối đa hai tuyến đường thay thế. |
| AlternateRoutesStrategy.SHOW_ONE | Hiển thị một tuyến đường thay thế (nếu có). |
| AlternateRoutesStrategy.SHOW_NONE | Ẩn các tuyến đường thay thế. |
Ví dụ về mã sau đây minh hoạ cách ẩn hoàn toàn các tuyến đường thay thế.
RoutingOptions routingOptions = new RoutingOptions();
routingOptions.alternateRoutesStrategy(AlternateRoutesStrategy.SHOW_NONE);
navigator.setDestinations(destinations, routingOptions, displayOptions);
Thanh tiến trình của chuyến đi

Thanh tiến trình của chuyến đi là một thanh dọc xuất hiện ở phía bắt đầu/phía trước của bản đồ khi quá trình đi theo chỉ dẫn bắt đầu. Khi được bật, chế độ này sẽ hiển thị thông tin tổng quan về toàn bộ chuyến đi, cùng với điểm đến và vị trí hiện tại của người dùng.
Điều này giúp người dùng dự đoán mọi vấn đề sắp xảy ra, chẳng hạn như tình trạng giao thông, mà không cần phóng to. Sau đó, họ có thể đổi tuyến đường cho chuyến đi nếu cần. Nếu người dùng đổi tuyến đường cho chuyến đi, thanh tiến trình sẽ đặt lại như thể một chuyến đi mới đã bắt đầu từ thời điểm đó.
Thanh tiến trình của chuyến đi cho biết các trạng thái sau:
Tuyến đường đã đi qua – phần đã đi qua của chuyến đi.
Vị trí hiện tại – vị trí hiện tại của người dùng trong chuyến đi.
Tình trạng giao thông – tình trạng giao thông sắp tới.
Điểm đến cuối cùng – điểm đến cuối cùng của chuyến đi.
Bật thanh tiến trình của chuyến đi bằng cách gọi phương thức setTripProgressBarEnabled() trên NavigationView hoặc NavigationFragment.
Ví dụ:
// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);
Vị trí thanh tiến trình chuyến đi
- Phía bên trái của thanh này gần như thẳng hàng với phía bên trái của đồng hồ tốc độ, biểu trưng Google và nút Đặt lại vị trí chính giữa (khi hiển thị). Chiều rộng là 12 dp.
- Thanh tiến trình của chuyến đi duy trì chiều cao cố định. Để thích ứng với các giới hạn về không gian dọc trên các thiết bị nhỏ hơn, chế độ hiển thị và chiều cao của thanh tiến trình chuyến đi sẽ điều chỉnh dựa trên các điểm ngắt được chỉ định trong chiều cao màn hình. Các điểm ngắt này không phụ thuộc vào hướng của thiết bị và không gian thực tế mà bản đồ chiếm trên màn hình:
- Nếu thanh tiến trình của chuyến đi chồng chéo với thẻ rẽ hoặc các phần tử trên giao diện người dùng khác của tính năng Điều hướng, thì thanh này sẽ xuất hiện bên dưới các phần tử khác đó.
| Chiều cao màn hình | Chế độ hiển thị thanh tiến trình của chuyến đi | Chiều cao của thanh tiến trình chuyến đi | Vị trí trục y của thanh tiến trình chuyến đi |
|---|---|---|---|
| Nhỏ: 0 dp – 551 dp | Không hiển thị | Không áp dụng | Không áp dụng |
| Trung bình: 552 dp – 739 dp | Hiển thị | 130 dp | Phía trên các nút điều khiển ở bên trái (đồng hồ tốc độ / biểu trưng Google / nút Đặt lại vị trí chính giữa) |
| Lớn: 740 dp trở lên | Hiển thị | 290 dp | Phía trên các nút điều khiển ở bên trái (đồng hồ tốc độ / biểu trưng Google / nút Đặt lại vị trí chính giữa) |
La bàn
Navigation SDK cung cấp hình ảnh la bàn xuất hiện ở góc trên cùng bên phải của bản đồ trong một số trường hợp nhất định và chỉ khi được bật. Khi người dùng nhấp vào la bàn, camera sẽ tạo ảnh động trở lại vị trí có hướng bằng 0 (hướng mặc định) và la bàn sẽ mờ dần ngay sau đó.
Nếu bạn bật tính năng chỉ đường và đặt chế độ camera thành "đang theo dõi", thì la bàn sẽ vẫn hiển thị và khi bạn nhấn vào la bàn, góc nhìn của camera sẽ chuyển đổi giữa chế độ nghiêng và chế độ xem tổng quan.
Để tránh gây mất tập trung cho người lái xe, la bàn sẽ giữ nguyên vị trí nếu tiêu đề (ở chế độ dọc) mở rộng và xung đột với vị trí mặc định của la bàn. Nếu bạn thêm một thành phần điều khiển tuỳ chỉnh cho tiêu đề phụ hoặc chế độ xem phụ kiện tiêu đề, thì la bàn sẽ bị ẩn để tránh xung đột giao diện người dùng.
La bàn hỗ trợ chế độ ban ngày và chế độ ban đêm, cũng như chế độ tối.
La bàn được bật theo mặc định. Bạn có thể đặt xem có bật la bàn hay không bằng cách sử dụng phương thức compassEnabled trên lớp GoogleMapOptions.
Tắt toà nhà 3D
Đối với các thiết bị có hiệu suất hạn chế, bạn có thể tắt chế độ hiển thị toà nhà 3D bằng cách gọi GoogleMap.setBuildingsEnabled(false).
Prompt Visibility API (Thử nghiệm)
Prompt Visibility API giúp bạn tránh xung đột giữa các phần tử trên giao diện người dùng do SDK điều hướng tạo ra và các phần tử trên giao diện người dùng tuỳ chỉnh của riêng bạn bằng cách thêm trình nghe để nhận lệnh gọi lại trước khi một phần tử trên giao diện người dùng của SDK điều hướng sắp xuất hiện và ngay khi phần tử đó bị xoá. Để biết thêm thông tin, bao gồm cả mã mẫu, hãy xem phần API Hiển thị lời nhắc trên trang Định cấu hình sự gián đoạn theo thời gian thực.