Ẩn thanh trạng thái

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

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

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 trong onResume() hoặc onWindowFocusChanged().
  • 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.