Tôi gặp sự cố khi chuyển đổi hoạt động & các đoạn trên kích thước thiết bị nhất định, khi thay đổi hướng xảy ra. Trong trường hợp của tôi là màn hình large
nhưng có thể xảy ra với các kích thước màn hình khác tùy thuộc vào ứng dụng. Tôi đã nhìn xung quanh để tìm câu trả lời, nhưng không có gì có vẻ đúng địa chỉ này.Chuyển đổi các mảnh vỡ hoặc hoạt động (ví dụ: bố cục) về thay đổi hướng
Tôi có hai hoạt động, MainActivity và SubordinateActivity. MainActivity là điểm vào duy nhất cho ứng dụng; MainActivity khởi chạy SubordinateActivity. Mỗi hoạt động có phân đoạn riêng của nó, MainFragment và SubordinateFragment. Khi chạy trên các thiết bị normal
, mỗi lần chỉ có đủ không gian trên màn hình cho một đoạn bất kể định hướng. Trong trường hợp đó, mỗi hoạt động sẽ quản lý phân đoạn riêng của nó. Trên các thiết bị xlarge
, có đủ không gian cho hai đoạn, bất kể định hướng. Trong trường hợp này, có các tệp bố cục khác nhau cho phép hai đoạn trên màn hình. Cả MainFragment và SubordinateFragment đều được quản lý bởi MainActivity (SubordinateActivity không bao giờ được sử dụng).
Sự cố phát sinh với màn hình large
. Sử dụng định hướng ngang, có đủ không gian cho hai đoạn, nhưng theo hướng dọc thì không có. Tôi có các tệp bố cục thích hợp cho mỗi tệp. Trong chế độ ngang, MainActivity quản lý cả hai đoạn (như với thiết bị xlarge
) và ở chế độ dọc, mỗi hoạt động quản lý phân đoạn riêng của nó (như với thiết bị normal
). Điều này tạo ra sự cố trong hai trường hợp:
- SubordinateActivity được tải ở chế độ dọc và hướng thay đổi về chế độ ngang. Những gì tôi muốn: SubordinateActivity nên được loại bỏ và MainActivity nên tải, với nội dung được hiển thị trước bởi SubordinateActivity, được hiển thị trong SubordinateFragment của riêng nó. Sự cố: SubordinateActivity vẫn được tải theo chính nó ở chế độ ngang.
- MainActivity được nạp với MainFragment và SubordinateFragment ở chế độ nằm ngang và hướng chuyển sang chế độ dọc. Điều tôi muốn: Nội dung được hiển thị trước đó trong SubordinateFragment bây giờ sẽ được hiển thị một mình bởi SubordinateActivity. Sự cố: MainActivity chỉ hiển thị với nội dung từ MainFragment.
Một ví dụ điển hình của vấn đề này là ứng dụng Gmail. Dưới đây là một số ảnh chụp màn hình từ ứng dụng đó trong trường hợp nó không rõ ràng những gì tôi đang nói về. Tôi nhận ra giao diện người dùng của ứng dụng Gmail thực sự phức tạp hơn tôi, nhưng vấn đề là như nhau.
Tôi chắc chắn rằng đây là một vấn đề khác đã gặp phải vì các nhà phát triển GMail gặp nó quá. Tôi không thể tìm ra giải pháp tốt là gì, bởi vì mọi khả năng có vẻ liên quan đến việc vi phạm các phương pháp hay nhất của giao diện người dùng Android hoặc tạo ra một số rối loạn không chính xác giữa mã Hoạt động và bố cục XML.
Dưới đây là một số ý tưởng tôi có, không ai trong số đó dường như thực sự chính xác:
- Phát hiện sự thay đổi định hướng trong cả hai hoạt động, và khởi động các hoạt động khác (ví dụ, bằng cách sử dụng FLAG_ACTIVITY_CLEAR_TOP) quay trở lại xuống ngăn xếp và tải một hoạt động đã được tải trước đó, với một mục đích mới.Đây là vấn đề vì mã thay đổi hướng chỉ nên được thực hiện trên các thiết bị
large
, có nghĩa là trộn lẫn mã kiểm tra bố cục nào có sẵn với mã hoạt động. - Hoàn toàn giảm SubordinateActivity. Có vẻ như một chút thừa và MainActivity có thể quản lý các mảnh riêng của mình, ngay cả trên các thiết bị kích thước
normal
, nơi nó có thể chỉ trao đổi MainFragment và SubordinateFragment khi cần thiết. Cuối cùng tôi không nghĩ rằng điều này giải quyết được vấn đề vì MainActivity vẫn dựa vào các tệp layout để cho nó biết và có bao nhiêu đoạn để hiển thị. Điều này cũng sẽ vi phạm nguyên tắc là một Hoạt động đại diện cho một điều rời rạc mà người dùng thực hiện.
Dưới đây là một số tài nguyên tôi đã xem xét để giải quyết vấn đề này. Như tôi đã nói, đây có vẻ là một vấn đề phổ biến, nhưng dường như không có giải pháp Android chuẩn. Đây là một chút thiếu sót kể từ khi tài liệu đề xuất sử dụng Phân đoạn và mọi nhà phát triển, sẽ chạy vào vấn đề này.
- Tasks and Back Stack
- How to Controll Android back stack
- How to start a new activity when screen orientation changes? Android
- onNewIntent() lifecycle and registered listeners
- Multi-pane Layouts
- Switch from dual pane to single pane on orientation change maintaining fragment stack
- android Fragment issue with orientation change
- Fragments restore state on orientation changed
Tóm tắt: Tôi có chế độ nhiều cửa sổ làm việc cho xlarge
thiết bị. Vấn đề tôi đang cố giải quyết là chuyển đổi giữa chế độ cửa sổ đơn (dọc) và đa cửa sổ (ngang) trên large
các thiết bị chỉ có thể xử lý nhiều ngăn theo hướng ngang.
OH! Tôi đang khóc. Một trong những câu hỏi VERY FEW được nghiên cứu và viết đúng cách trước khi được hỏi tôi đã thấy từ một thời gian. Chúc may mắn tìm giải pháp của bạn! Rất tiếc, tôi không thể đóng góp ngoại trừ +1 và ngôi sao –