Ẩ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 Android. Việc ẩn thanh trạng thái (và thanh điều hướng không bắt buộc) cho phép nội dung sử dụng nhiều không gian hiển thị hơn, từ đó mang lại trải nghiệm người dùng sống động hơn.

Hình 1 cho thấy một ứng dụng có thanh trạng thái:

thanh hệ thống

Hình 1. Thanh trạng thái hiển thị.

Hình 2 minh hoạ một ứng dụng có thanh trạng thái ẩn. Xin lưu ý rằng thanh thao tác cũng bị ẩn. Bạn không đượ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 đặt 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 tệp kê khai của ứng dụng là phương pháp ưu tiên nếu thanh trạng thái phải luôn ẩn trong ứng dụng (mặc dù nói đúng ra, bạn có thể ghi đè giao diện theo phương thức lập trình nếu muốn). Ví dụ:

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

Sau đây là ưu điểm của việc sử dụng chủ đề hoạt động:

  • Sẽ dễ bảo trì hơn và ít xảy ra lỗi hơn so với 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ó 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 thanh trạng thái khi người dùng tương tác với ứ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ờ này sẽ vẫn có hiệu lực trừ phi ứng dụng của bạn xoá chúng.

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ật FLAG_FULLSCREEN. Điều này ngăn nội dung của bạn đổi kích thước khi thanh trạng thái bị ẩn và xuất 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 sử dụng setSystemUiVisibility(). setSystemUiVisibility() đặt cờ giao diện người dùng ở cấp chế độ xem riêng lẻ; các chế độ cài đặt này được tổng hợp thành cấp cửa sổ. Việc sử dụng setSystemUiVisibility() để đặt cờ giao diện người dùng sẽ giúp bạn có quyền kiểm soát chi tiết hơn đối với 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 các cờ giao diện người dùng bị xoá (ví dụ: bằng cách rời khỏi hoạt động), ứng dụng cần đặt lại các cờ đó nếu bạn muốn ẩn các thanh một lần nữa. Hãy xem phần Phản hồi các thay đổi về chế độ hiển thị giao diện người dùng để 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ể phản hồi phù hợp.
  • Vị trí đặt cờ giao diện người dùng sẽ tạo ra sự khác biệt. Nếu bạn ẩn các thanh hệ thống trong phương thức onCreate() của hoạt động và người dùng nhấn vào Màn hình chính, thì 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, các thanh hệ thống sẽ vẫn hiển thị. Nếu bạn muốn các thay đổi về giao diện người dùng hệ thống vẫn tồn tại khi người dùng di chuyển vào và ra khỏi hoạt động của bạn, hãy đặ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 thành phần hiển thị mà bạn gọi từ đó đang hiển thị.
  • Khi di chuyển ra khỏi khung hiển thị, các cờ được đặt bằng setSystemUiVisibility() sẽ bị xoá.

Làm cho 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 bị ẩn và hiển thị. Để thực hiện việc này, hãy sử dụng SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Có thể bạn cũng cần sử dụng SYSTEM_UI_FLAG_LAYOUT_STABLE để giúp ứng dụng duy trì bố cục ổn định.

Khi sử dụng phương pháp này, bạn có trách nhiệm đảm bảo rằng các phần quan trọng trên giao diện người dùng của ứng dụng (ví dụ: các chế độ điều khiển tích hợp trong ứng dụng Maps) không bị các 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 trường hợp, bạn có thể xử lý việc 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 không gian cho các cửa sổ hệ thống. Điều này là đủ cho 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 bố cục mong muốn cho ứng dụng của mình. Để thao tác trực tiếp cách bố trí nội dung so với thanh hệ thống (chiếm không gian gọi là "phần lồng ghép nội dung" của cửa sổ), hãy ghi đè fitSystemWindows(Rect insets). Phương thức fitSystemWindows() được hệ phân cấp khung hiển thị gọi 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ý các phần lồng ghép (và từ đó xử lý bố cục của ứng dụng) theo ý muốn.