ChromeOS hỗ trợ các ứng dụng Android ở nhiều cửa sổ. Hệ thống kết xuất các ứng dụng vào những vùng chứa cửa sổ có kích thước do kiểu dáng của thiết bị xác định, như minh hoạ trong hình 1.
Hình 1. Cửa sổ ứng dụng trên nhiều thiết bị.
Bạn cần 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ợ nhiều kích thước màn hình, thì ứng dụng của bạn cũng sẽ hoạt động tốt khi chạy trên ChromeOS.
Trang này cho biết cách giúp cửa sổ ứng dụng của bạn khởi chạy đúng cách, thay đổ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 khi phát hành lần đầu
Ứng dụng có thể yêu cầu kích thước khởi chạy ban đầu theo những cách sau:
Chỉ sử dụng kích thước khởi chạy trong môi trường máy tính. Điều này giúp trình quản lý cửa sổ cung cấp cho bạn ranh giới và hướng thích hợp. Để cho biết lựa chọn ưu tiên khi sử dụng ở chế độ máy tính, hãy thêm thẻ meta sau đây vào 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 ranh giới khởi chạy tĩnh. Sử dụng
<layout>bên trong mục nhập tệp kê khai của hoạt động để chỉ định kích thước bắt đầu "cố định", 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 ranh giới 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. Bằng cách 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ể thay đổ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 cùng bên phải, như minh hoạ trong hình 2.
Hình 2. Cửa sổ ứng dụng có thể thay đổi kích thước.
Có 2 lựa chọn để xử lý việc đổi kích thước cửa sổ khi dùng lớp View:
- Phản hồi các thay đổi về cấu hình một cách linh động bằng cách gọi
onConfigurationChanged(..). Ví dụ: bạn có thể thêmandroid: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 bài viết 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
onSaveInstanceStatevà sử dụng thành phần cấu trúc ViewModel để khôi phục trạng thái đã lưu trước đó.
Khi bạn sử dụng Jetpack Compose, hành vi đổi kích thước sẽ phụ thuộc vào cách bạn định cấu hình hoạt động. Nếu xử lý các thay đổi một cách linh động, thì quá trình kết hợp lại sẽ được kích hoạt khi kích thước cửa sổ thay đổi. Nếu hệ thống khởi động lại hoạt động, thì quá trình kết hợp ban đầu sẽ diễn ra sau khi khởi động lại. Dù bằng cách nào, bạn cũng cần tạo bố cục Compose thích ứng với các kích thước cửa sổ thay đổi. Đừng giả định kích thước cố định.
Kích thước cửa sổ
Các hoạt động của bạn sẽ đọc kích thước cửa sổ mỗi khi chúng bắt đầu và sắp xếp nội dung 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() trên 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 ở chế độ 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, vì vậy, không thể trích xuất dữ liệu hữu ích.
Xin 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. Để lấy kích thước cửa sổ theo DP, hãy sử dụng Activity.getResources().getConfiguration().screenWidth và Activity.getResources().getConfiguration().screenHeight. Có lẽ bạn sẽ không bao giờ cần dùng đến kích thước màn hình.
Ranh giới nội dung
Ranh giới nội dung của cửa sổ có thể thay đổi sau khi đổi kích thước. Ví dụ: vùng trong cửa sổ mà ứng dụng sử dụng có thể thay đổi nếu cửa sổ trở nên quá lớn để vừa với màn hình. Hãy làm theo các nguyên tắc sau:
- Các ứng dụng sử dụng quy trình bố cục của Android sẽ tự động được bố trí trong không gian có sẵn.
Các ứng dụng gốc cần đọc vùng có sẵn và theo dõi các thay đổi về kích thước để tránh có các phần tử giao diện người dùng không truy cập được. Gọi các phương thức sau để xác định kích thước ban đầu có sẵn cho vùng này:
NativeActivity.mLastContent[X/Y/Width/Height]()findViewById(android.R.id.content).get[Width/Height]()
Bạn có thể liên tục giám sát bằng cách sử dụng một đối tượng theo dõi:
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ệ trước cho hình minh hoạ, hãy làm như vậy mỗi khi độ phân giải thay đổi.
Đổi kích thước tuỳ ý
ChromeOS cho phép người dùng tự do đổi kích thước mọi cửa sổ: người dùng có thể thay đổi chiều rộng, chiều cao và vị trí của cửa sổ trên màn hình. Nhiều ứng dụng Android được viết mà không tính đến việc đổi kích thước tuỳ ý. Hãy cân nhắc những vấn đề sau:
- Vị trí màn hình có thể thay đổi. Luôn sử dụng hệ thống để thực hiện các phép biến đổi toạ độ từ cửa sổ sang màn hình và từ màn hình sang cửa sổ.
- Nếu bạn đang sử dụng hệ thống hiển thị của Android, bố cục cửa sổ sẽ tự động thay đổi khi kích thước thay đổi.
- Nếu không sử dụng hệ thống khung hiển thị và tiếp quản bề mặt, ứ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 sử dụng các thành phần
mLastContenthoặc sử 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 lắng nghe các sự kiện
onContentRectChangedNativehoặconGlobalLayoutđể 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 tỷ lệ hoặc tải lại bố cục và hình minh hoạ, đồng thời cập nhật các 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 Android gốc. Nếu cửa sổ không bao phủ toàn bộ màn hình, thì các yêu cầu chuyển sang chế độ toàn màn hình (ẩn tất cả các phần tử 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à chức năng toàn màn hình thông thường sẽ được thực hiện. Thao tác này sẽ ẩn các phần tử giao diện người dùng hệ thống (thanh điều khiển cửa sổ và giá đỡ).
Hướng màn hình
Hướng phổ biến nhất cho một ứng dụng Android là hướng dọc, vì đó là cách mà hầu hết điện thoại được cầm. Mặc dù chế độ dọc phù hợp với điện thoại, nhưng lại không phù hợp với máy tính xách tay và máy tính bảng, vì chế độ ngang phù hợp hơn. Để đạt được kết quả tốt nhất cho ứng dụng của bạn, hãy cân nhắc việc hỗ trợ cả hai hướng.
Một số ứng dụng Android giả định rằng khi thiết bị được giữ ở 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 ở một chế độ ARC nhất định, giá trị xoay cho hướng dọc có thể không phải là Surface.ROTATION_0.
Để nhận được giá trị xoay chính xác trong khi đọc gia tốc kế hoặc các cảm biến tương tự, hãy sử dụng phương thức Display.getRotation() và hoán đổi trục cho phù hợp.
Hoạt động gốc và hướng
Cửa sổ Chromebook bao gồm một ngăn xếp các cửa sổ hoạt động. Mỗi cửa sổ trong ngăn xếp đều có cùng kích thước và hướng.
Những thay đổi đột ngột về hướng và kích thước sẽ gây nhầm lẫn trong môi trường máy tính. Trình quản lý cửa sổ của Chromebook tránh trường hợp này theo cách tương tự như chế độ song song của Android: hoạt động ở dưới cùng của ngăn xếp sẽ kiểm soát các thuộc tính của tất cả hoạt động ở phía trê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 ở chế độ dọc và không thể thay đổi kích thước sẽ chuyển sang chế độ ngang và có thể thay đổi kích thước.
Chế độ thiết bị có ảnh hưởng ở đây: ở chế độ máy tính bảng, hướng không bị khoá và mỗi cửa sổ sẽ giữ lại 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 để 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ề thông tin đó trước khi khởi động ứng dụng. Khi chỉ định hướng, hãy chỉ định cả hướng của cảm biến (nếu có thể). Chromebook thường là thiết bị có thể chuyển đổi và ứng dụng bị lộn ngược là một trải nghiệm người dùng không tốt.
- Hãy cố gắng giữ một hướng đã chọn. Tránh yêu cầu một hướng trong tệp kê khai và thiết lập một hướng khác theo phương thức lập trình sau này.
- 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ể bị mắc kẹt trong một cửa sổ nhỏ ở chế độ dọc và không thể quay lại cửa sổ lớn hơn ở chế độ ngang.
- Chrome có các nút điều khiển cửa sổ để chuyển đổi giữa tất cả các bố cục hiện có. Bằng cách chọn đúng lựa chọn hướng, 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 một ứng dụng có sẵn ở hướng dọc và hướng ngang, hãy đặt hướng ngang làm hướng mặc định nếu có thể. Sau khi bạn đặt lựa chọn này, hệ thống sẽ ghi nhớ lựa chọn đó cho từng ứ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 hướng hoạt động là dọc, nhưng ứng dụng gọi
setRequestedOrientation(LANDSCAPE)trong thời gian chạy, thì điều này sẽ gây ra tình trạng thay đổi kích thước cửa sổ không cần thiết, gây phiền toái 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. 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
Dưới đâ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:
- Đừng gọi
finish()trong phương thứconDestroycủa hoạt động. Điều này khiến ứng dụng đóng khi thay đổ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_KEYGUARDvàTYPE_APPLICATION_MEDIA. - Tăng tốc độ khởi động lại hoạt động bằng cách lưu vào bộ nhớ đệm các đối tượng đã được 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=falsetrong tệp kê khai. - Kiểm thử ứng dụng để đảm bảo ứng dụng xử lý các thay đổi về kích thước cửa sổ một cách phù hợp.