Bài học này mô tả cách ẩn thanh trạng thái trên các phiên bản khác nhau của Android. Ẩn thanh trạng thái (và thanh điều hướng theo tuỳ chọn) cho phép nội dung sử dụng nhiều không gian hiển thị hơn, do đó mang lại trải nghiệm người dùng phong phú hơn.
Hình 1 cho thấy một ứng dụng có thanh trạng thái hiển thị:
![thanh hệ thống](https://developer.android.google.cn/static/images/training/status_bar_show.png?authuser=19&hl=vi)
Hình 1. Thanh trạng thái hiển thị.
Hình 2 cho thấy một ứng dụng có thanh trạng thái bị ẩn. Lưu ý rằng thanh tác vụ cũng bị ẩn. Bạn không bao giờ được hiển thị thanh tác vụ mà không có thanh trạng thái.
![thanh hệ thống](https://developer.android.google.cn/static/images/training/status_bar_hide.png?authuser=19&hl=vi)
Hình 2. Thanh trạng thái ẩn.
Ẩn Thanh trạng thái trên Android 4.0 trở xuống
Bạn có thể ẩn thanh trạng thái trên Android 4.0 (API cấp 14) trở xuống bằng cách thiết lập
Cờ WindowManager
. Bạn có thể thực hiện việc này theo phương thức lập trình hoặc bằng cách
thiết lập giao diện hoạt động trong tệp kê khai của ứng dụng. Đặt giao diện hoạt động trong ứng dụng
tệp kê khai là phương pháp ưu tiên nếu thanh trạng thái phải luôn giữ nguyên
ẩn trong ứng dụng của bạn (mặc dù nói đúng ra, bạn có thể lập trình để ghi đè
nếu bạn muốn). Ví dụ:
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ... </application>
Sau đây là các ưu điểm của việc sử dụng giao diện hoạt động:
- Việc duy trì dễ dàng hơn và ít gặp lỗi hơn so với việc gắn cờ theo phương thức lập trình.
- Điều này giúp quá trình chuyển đổi giao diện người dùng diễn ra suôn sẻ hơn vì hệ thống có được thông tin cần thiết để hiển thị giao diện người dùng trước khi tạo thực thể cho hoạt động chính của ứng dụng.
Ngoài ra, bạn có thể đặt cờ WindowManager
theo phương thức lập trình.
Phương pháp này giúp bạn dễ dàng ẩn và hiển thị thanh trạng thái khi người dùng tương tác
ứng dụng của bạn:
Kotlin
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // If the Android version is lower than Jellybean, use this call to hide // the status bar. if (Build.VERSION.SDK_INT < 16) { window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) } setContentView(R.layout.activity_main) } ... }
Java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // If the Android version is lower than Jellybean, use this call to hide // the status bar. if (Build.VERSION.SDK_INT < 16) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } setContentView(R.layout.activity_main); } ... }
Khi bạn đặt cờ WindowManager
(cho dù thông qua chủ đề hoạt động hay
theo phương thức lập trình), cờ vẫn sẽ có hiệu lực trừ phi ứng dụng của bạn xoá các cờ đó.
Bạn có thể sử dụng
FLAG_LAYOUT_IN_SCREEN
để đặt bố cục hoạt động nhằm sử dụng cùng một khu vực màn hình có sẵn khi bạn bật
FLAG_FULLSCREEN
Việc này giúp ngăn chặn
cho nội dung thay đổi kích thước khi thanh trạng thái ẩn và hiện.
Ẩn Thanh trạng thái trên Android 4.1 trở lên
Bạn có thể ẩn thanh trạng thái trên Android 4.1 (API cấp 16) trở lên bằng cách
đang sử dụng setSystemUiVisibility()
.
setSystemUiVisibility()
đặt cờ giao diện người dùng ở mức
cấp chế độ xem riêng lẻ; các chế độ cài đặt này được tổng hợp theo cấp độ cửa sổ. Sử dụng
setSystemUiVisibility()
để đặt cờ giao diện người dùng
giúp bạn kiểm soát chi tiết hơn các thanh hệ thống so với việc sử dụng
Cờ WindowManager
. Đoạn mã này ẩn thanh trạng thái:
Kotlin
// Hide the status bar. window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN // Remember that you should never show the action bar if the // status bar is hidden, so hide that too if necessary. actionBar?.hide()
Java
View decorView = getWindow().getDecorView(); // Hide the status bar. int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); // Remember that you should never show the action bar if the // status bar is hidden, so hide that too if necessary. ActionBar actionBar = getActionBar(); actionBar.hide();
Xin lưu ý những điều sau:
- Sau khi đã xoá cờ giao diện người dùng (ví dụ: bằng cách rời khỏi hoạt động), ứng dụng của bạn cần đặt lại chúng nếu bạn muốn ẩn lại các thanh đó. Hãy xem bài viết Cách phản hồi các thay đổi về chế độ hiển thị trên giao diện người dùng để biết thảo luận về cách theo dõi các thay đổi về chế độ hiển thị giao diện người dùng để ứng dụng của bạn có thể sẽ phản hồi phù hợp.
- Vị trí bạn đặt cờ giao diện người dùng tạo nên sự khác biệt. Nếu bạn ẩn các thanh hệ thống trong phần hoạt động của mình
onCreate()
và người dùng nhấn vào Màn hình chính, các thanh hệ thống sẽ xuất hiện lại. Khi người dùng mở lại hoạt động,onCreate()
sẽ không được gọi, vì vậy thanh hệ thống sẽ vẫn hiển thị. Nếu bạn muốn thay đổi giao diện người dùng hệ thống thành duy trì khi người dùng di chuyển vào và ra khỏi hoạt động của bạn, đặt cờ giao diện người dùng trongonResume()
hoặconWindowFocusChanged()
. - Phương thức
setSystemUiVisibility()
chỉ có hiệu lực nếu chế độ xem mà bạn dùng để gọi nó có thể nhìn thấy. - Việc điều hướng ra khỏi khung hiển thị sẽ gây ra cờ
đặt bằng
setSystemUiVisibility()
cần xoá.
Đặt nội dung xuất hiện phía sau thanh trạng thái
Trên Android 4.1 trở lên, bạn có thể thiết lập để nội dung của ứng dụng xuất hiện phía sau
thanh trạng thái để nội dung không đổi kích thước khi thanh trạng thái ẩn và hiển thị.
Để làm việc này, hãy sử dụng
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
.
Có thể bạn cũng cần phải sử dụng
SYSTEM_UI_FLAG_LAYOUT_STABLE
để giúp ứng dụng của bạn duy trì
bố cục ổn định.
Khi áp dụng phương pháp này, bạn có trách nhiệm đảm bảo rằng những phần quan trọng
giao diện người dùng của ứng dụng (ví dụ: các chế độ điều khiển được tích hợp sẵn trong ứng dụng Maps) không kết thúc
bị thanh hệ thống che khuất. Điều này có thể khiến ứng dụng của bạn không sử dụng được. Trong hầu hết các trường hợp, bạn có thể
xử lý vấn đề này bằng cách thêm thuộc tính android:fitsSystemWindows
vào tệp bố cục XML, đặt thành
true
Thao tác này sẽ điều chỉnh khoảng đệm của ViewGroup
mẹ
để chừa lại khoảng trống cho các cửa sổ hệ thống. Chỉ số này là đủ trong hầu hết các ứng dụng.
Tuy nhiên, trong một số trường hợp, bạn có thể cần phải sửa đổi khoảng đệm mặc định để có được giá trị mong muốn
cho ứng dụng của mình. Để trực tiếp điều khiển cách
nội dung được bố trí tương ứng với các thanh hệ thống (chiếm một không gian được gọi là
"phần lồng ghép nội dung"), ghi đè fitSystemWindows(Rect insets)
.
Phương thức fitSystemWindows()
được gọi bởi
hệ phân cấp khung hiển thị khi các phần lồng ghép nội dung cho một cửa sổ thay đổi, để cho phép cửa sổ đó
điều chỉnh nội dung cho phù hợp. Bằng cách ghi đè phương thức này, bạn có thể xử lý
phần lồng ghép (và do đó là bố cục của ứng dụng) theo ý muốn.