7

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:

  1. 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.
  2. 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.

GMail message listGMail message display

GMail in landscape orientation on large device

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.

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.

+3

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 –

Trả lời

3

Giết SubordinateActivity và có điểm nhập duy nhất trong đơn đăng ký của bạn là MainActivity sau đó quyết định điền vào toàn bộ chế độ xem với MainFragment hoặc SubordinateFragment. Bạn có thể tìm thấy ví dụ về cách thực hiện điều này bằng cách looking at the developer docs for the design guide you linked to. Sau khi bạn thực hiện việc này, bạn có thể tạo thư mục tài nguyên cụ thể cho lớn và ngang, res/layout/large-landas stated here và thiết lập tệp bố cục cho MainActivity để bao gồm hai đoạn tương tự bài họC# 2 trong liên kết từ đoạn trước. Hãy tạo điều đó, cùng với bố cục XML bình thường của bạn thay đổi thành những gì được mô tả trong tài liệu đó sẽ tự động xử lý mọi thứ bạn mô tả từ một sự thay đổi định hướng về mặt kỹ thuật là một hoạt động tái tạo.

+0

Bằng cách "xóa SubordinateActivity", bạn có nghĩa là xóa nó khỏi mã, chỉ sử dụng một hoạt động duy nhất, như trong tùy chọn thứ hai được liệt kê ở trên, hoặc điều gì đó khác? Ngoài ra, để làm rõ, MainActivity là điểm vào duy nhất. –

+0

Tôi chỉ sử dụng một hoạt động đơn lẻ. Những gì bạn đang làm là khá gần với chế độ xem chi tiết chính hoạt động tốt nhất với một hoạt động. –

Các vấn đề liên quan