Quản lý cửa sổ

ChromeOS hỗ trợ các ứng dụng Android trong nhiều cửa sổ. Hệ thống kết xuất các ứng dụng vào vùng chứa cửa sổ có kích thước được xác định theo hệ số hình dạng của thiết bị, như minh hoạ trong hình 1.

Hình 1. Một cửa sổ ứng dụng trên nhiều thiết bị.

Điều quan trọng là bạn phải thiết kế bố cục hoạt động với nhiều kích thước màn hình. Nếu bạn làm theo các nguyên tắc của Android để hỗ trợ các màn hình khác nhau thì ứng dụng của bạn cũng hoạt động tốt khi chạy trên ChromeOS.

Trang này trình bày cách đảm bảo cửa sổ ứng dụng khởi chạy chính xác, đổi kích thước một cách mượt mà và hiển thị tất cả nội dung khi kích thước thay đổi.

Kích thước bản phát hành ban đầu

Các ứng dụng có thể yêu cầu quy mô khởi chạy ban đầu theo các cách sau:

  • Chỉ sử dụng kích thước khởi chạy trong môi trường máy tính để bàn. Điều này giúp trình quản lý cửa sổ cung cấp cho bạn những giới hạn và hướng. Để cho biết một lựa chọn ưu tiên khi dùng ở chế độ máy tính, hãy thêm các thẻ meta sau bên trong <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Sử dụng giới hạn khởi chạy tĩnh. Sử dụng <layout> bên trong mục kê khai của hoạt động để chỉ định một "cố định" kích thước ban đầu, như trong ví dụ sau:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • Sử dụng giới hạn khởi chạy động. Một hoạt động có thể tạo và sử dụng ActivityOptions.setLaunchBounds(Rect) khi tạo một hoạt động mới. Theo chỉ định một hình chữ nhật trống, ứng dụng của bạn có thể được tối đa hoá.

Đổi kích thước cửa sổ

Trong ChromeOS, người dùng có thể đổi kích thước cửa sổ của ứng dụng theo cách thông thường: bằng cách kéo góc dưới bên phải, như minh họa trong hình 2.

Hình 2. Cửa sổ ứng dụng có thể đổi kích thước.

Có hai tuỳ chọn để xử lý việc đổi kích thước cửa sổ khi sử dụng Lớp View:

  • Tự động phản hồi các thay đổi về cấu hình bằng cách gọi onConfigurationChanged(..). Ví dụ: bạn có thể thêm android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" vào tệp kê khai của hoạt động. Để biết thêm thông tin về cách xử lý các thay đổi về cấu hình, hãy đọc Xử lý các thay đổi về cấu hình.
  • Cho phép hệ thống khởi động lại hoạt động. Trong trường hợp này, hãy triển khai onSaveInstanceState và sử dụng kiến trúc ViewModel thành phần để khôi phục thuộc tính trước đó trạng thái đã lưu.

Khi sử dụng Jetpack Compose, hành vi đổi kích thước phụ thuộc vào cách định cấu hình hoạt động của bạn. Nếu mã này xử lý các thay đổi một cách linh động, quá trình kết hợp lại được kích hoạt khi kích thước cửa sổ thay đổi. Nếu hoạt động là được hệ thống khởi động lại, quá trình kết hợp ban đầu sẽ diễn ra sau khi khởi động lại. Một trong hai bạn cần tạo bố cục Compose thích ứng với cửa sổ thay đổi kích thước. Đừng giả định kích thước cố định.

Kích thước cửa sổ

Yêu cầu hoạt động đọc kích thước cửa sổ mỗi khi bắt đầu và sắp xếp nội dung của chúng theo cấu hình hiện tại.

Để xác định cấu hình hiện tại, hãy gọi getResources().getConfiguration() đối với hoạt động hiện tại. Không sử dụng cấu hình của hoạt động nền hoặc tài nguyên hệ thống. Hoạt động trong nền không có kích thước và cấu hình hệ thống có thể chứa nhiều cửa sổ có kích thước và hướng xung đột nhau, vì vậy không sử dụng được dữ liệu có thể được trích xuất.

Lưu ý rằng kích thước cửa sổ và kích thước màn hình không giống nhau. Để tải kích thước cửa sổ trong DP, hãy dùng Activity.getResources().getConfiguration().screenWidthActivity.getResources().getConfiguration().screenHeight. Có thể bạn không bao giờ cần sử dụng kích thước màn hình.

Giới hạn nội dung

Các giới hạn nội dung của cửa sổ có thể thay đổi sau khi đổi kích thước. Ví dụ: khu vực bên trong cửa sổ mà ứng dụng dùng có thể thay đổi nếu cửa sổ đó quá lớn vừa với màn hình. Hãy làm theo các nguyên tắc sau:

  • Ứng dụng dùng quy trình bố cục của Android sẽ tự động được bố trí trong không gian còn trống.
  • Ứng dụng gốc cần đọc khu vực có sẵn và theo dõi các thay đổi về kích thước để tránh có thành phần không thể truy cập được trên giao diện người dùng. Gọi các phương thức sau để xác định kích thước ban đầu hiện có cho nền tảng này:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    Quá trình giám sát liên tục có thể được thực hiện bằng cách sử dụng đối tượng tiếp nhận dữ liệu:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • Thêm trình nghe vào view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    Nếu ứng dụng đang điều chỉnh tỷ lệ hình minh hoạ trước, hãy thực hiện việc này mỗi khi độ phân giải thay đổi.

Đổi kích thước dạng tự do

ChromeOS cho phép tự do đổi kích thước mọi cửa sổ: người dùng có thể thay đổi kích thước của cửa sổ chiều rộng, chiều cao và vị trí trên màn hình. Nhiều ứng dụng Android được viết mà không có thay đổi kích thước dạng tự do. Hãy xem xét các vấn đề sau:

  • Vị trí màn hình có thể thay đổi. Luôn sử dụng để thực hiện phép biến đổi toạ độ giữa các màn hình và từ màn hình sang cửa sổ.
  • Nếu bạn đang dùng hệ thống hiển thị của Android, bố cục cửa sổ của bạn tự động thay đổi khi kích thước của hình ảnh thay đổi.
  • Nếu bạn không sử dụng hệ thống hiển thị và giành quyền kiểm soát nền tảng, thì ứng dụng của bạn phải tự xử lý các thay đổi về kích thước.
  • Đối với các ứng dụng gốc, hãy dùng thành phần mLastContent hoặc dùng khung hiển thị nội dung để xác định kích thước ban đầu.
  • Khi ứng dụng đang chạy, hãy nghe onContentRectChangedNative hoặc onGlobalLayout sự kiện để phản ứng với các thay đổi về kích thước.
  • Khi kích thước của ứng dụng thay đổi, hãy điều chỉnh kích thước hoặc tải lại bố cục và hình minh hoạ và cập nhật vùng nhập.

Chế độ toàn màn hình

Chế độ toàn màn hình hoạt động giống như trên thiết bị Android lưu trữ. Nếu cửa sổ không che khuất toàn màn hình, hãy yêu cầu màn hình toàn màn hình (ẩn tất cả các phần tử trên giao diện người dùng hệ thống) sẽ bị bỏ qua. Khi ứng dụng được phóng to các phương thức, bố cục và hàm toàn màn hình thông thường được thực hiện. Thao tác này sẽ ẩn các thành phần trên giao diện người dùng hệ thống (thanh điều khiển cửa sổ và kệ).

Hướng màn hình

Hướng phổ biến nhất của ứng dụng Android là hướng dọc, vì đó là hướng dọc hầu hết các điện thoại đều đang cầm. Mặc dù chân dung rất phù hợp với điện thoại, nhưng lại rất hiệu quả đối với máy tính xách tay và máy tính bảng, trong đó ưu tiên màn hình ngang. Để tải kết quả tốt nhất cho ứng dụng của bạn, hãy cân nhắc hỗ trợ cả hai hướng.

Một số ứng dụng Android giả định rằng khi giữ thiết bị ở chế độ dọc, giá trị xoay là Surface.ROTATION_0. Điều này có thể đúng với hầu hết các thiết bị Android. Tuy nhiên, khi ứng dụng đang ở nhất định Chế độ ARC, giá trị xoay cho hướng dọc có thể không Surface.ROTATION_0.

Để có được giá trị xoay chính xác khi đọc gia tốc kế hoặc các thao tác tương tự cảm biến, hãy sử dụng Display.getRotation() và hoán đổi trục cho phù hợp.

Hướng và hoạt động gốc

Cửa sổ Chromebook bao gồm một ngăn xếp các cửa sổ hoạt động. Từng cửa sổ trong ngăn xếp có cùng kích thước và hướng.

Sự thay đổi đột ngột về hướng và kích thước gây nhầm lẫn trong máy tính để bàn môi trường. Trình quản lý cửa sổ Chromebook tránh được điều này theo cách tương tự như sang chế độ song song của Android: hoạt động ở cuối ngăn xếp điều khiển thuộc tính của tất cả các hoạt động bên trên nó. Điều này có thể dẫn đến những tình huống không mong muốn trong đó một hoạt động mới bắt đầu có định dạng dọc và không thể đổi kích thước sẽ chuyển thành dạng ngang và có thể đổi kích thước.

Chế độ thiết bị sẽ có tác động như sau: ở chế độ máy tính bảng, hướng không bị khoá và mỗi cửa sổ giữ nguyên hướng riêng, như bình thường trên Android.

Nguyên tắc về hướng

Hãy làm theo các nguyên tắc sau đây để xử lý hướng:

  • Nếu bạn chỉ hỗ trợ một hướng, hãy thêm thông tin vào tệp kê khai để trình quản lý cửa sổ biết về việc này trước khi khởi động ứng dụng. Khi chỉ định hướng, đồng thời chỉ định cả hướng cảm biến khi có thể. Chromebook thường là thiết bị chuyển đổi được và ứng dụng bị lộn ngược là trải nghiệm không tốt cho người dùng.
  • Hãy cố gắng giữ nguyên theo một hướng đã chọn. Tránh yêu cầu một hướng trong tệp kê khai và đặt một mã khác theo phương thức lập trình vào lúc khác.
  • Hãy cẩn thận khi thay đổi hướng dựa trên kích thước cửa sổ. Người dùng có thể nhận được bị mắc kẹt trong một cửa sổ nhỏ có kích thước dọc và không thể quay lại cửa sổ lớn hơn cửa sổ ngang.
  • Chrome có các chế độ điều khiển cửa sổ để bạn chuyển đổi giữa tất cả các chế độ hiện có của bạn. Bằng cách chọn tuỳ chọn hướng chính xác, bạn có thể đảm bảo rằng người dùng có bố cục chính xác sau khi khởi chạy ứng dụng. Nếu ứng dụng có ở chế độ dọc và ngang, hãy đặt chế độ mặc định là ngang, nếu có thể. Sau khi đặt tuỳ chọn này, hoạt động đó được ghi nhớ trên mỗi ứng dụng.
  • Cố gắng tránh những thay đổi không cần thiết về hướng. Ví dụ: nếu hoạt động hướng dọc, nhưng ứng dụng gọi setRequestedOrientation(LANDSCAPE) trong thời gian chạy, điều này dẫn đến việc đổi kích thước cửa sổ một cách không cần thiết, gây khó chịu cho người dùng và có thể khởi động lại ứng dụng mà ứng dụng không xử lý được. Tốt hơn là bạn nên đặt hướng một lần, ví dụ: trong tệp kê khai và chỉ thay đổi hướng đó nếu cần.

Lưu ý khác

Sau đây là một số điều khác cần cân nhắc khi làm việc với các ứng dụng Android trong ChromeOS:

  • Không gọi finish() trong phương thức onDestroy của hoạt động. Điều này khiến để đóng khi đổi kích thước và không khởi động lại.
  • Không sử dụng các loại cửa sổ không tương thích, chẳng hạn như TYPE_KEYGUARDTYPE_APPLICATION_MEDIA
  • Giúp hoạt động khởi động lại nhanh chóng bằng cách lưu các đối tượng đã lưu vào bộ nhớ đệm đã phân bổ trước đó.
  • Nếu bạn không muốn người dùng đổi kích thước ứng dụng, hãy chỉ định android:resizeableActivity=false trong tệp kê khai.
  • Kiểm thử ứng dụng để đảm bảo ứng dụng xử lý các thay đổi trong kích thước cửa sổ phù hợp.