Tôi đang cố gắng hiểu cách bảo toàn trạng thái xem phân đoạn khi phân đoạn được sử dụng trong các tab điều hướng. Trong nỗ lực của tôi, tôi đã gặp hai vấn đề mà tôi không thể tìm thấy bất kỳ giải pháp thích hợp nào.Tab điều hướng Android: Khôi phục trạng thái xem phân đoạn
Tôi có hai tab, Tab1 và Tab2. Bố cục của Tab1 được xác định bởi bố cục của FragmentA và Tab2 được định nghĩa bởi FragmentB. Tôi đã theo phương pháp đưa ra ở đây: Adding navigation tabs
Vấn đề đầu tiên: Mặc dù quan điểm của tôi có ID, các quốc gia của họ không được phục hồi hoàn toàn khi một đoạn được tái đính kèm (sau khi một công tắc xoay tab). Cụ thể: Một EditText với một ID thực sự lưu văn bản đã nhập của nó, nhưng nó không lưu trạng thái được kích hoạt của nó. Ngoài ra các nút của tôi không lưu nếu chúng được kích hoạt hoặc vô hiệu hóa mặc dù chúng có ID. Tôi đã tìm thấy hai cách giải quyết có thể cho vấn đề này:
- Sử dụng
hide()/show()
thay vìattach()/detach()
khi chuyển tab. - trong
onPause()
lưu trạng thái chế độ xem đoạn hiện tại trong một biến mẫuView
của đoạn quagetView()
. TrongonCreateView(Bundle savedInstanceState)
hãy kiểm tra xem trường này có phải là không null hay không và nếu trường hợp đó trả về giá trị của trường này. Giải pháp này có vẻ như bị hack, và tôi đã được bảo rằng nó cũng có thể giới thiệu một rò rỉ bộ nhớ trong ứng dụng của tôi.
Vấn đề thứ hai: Hãy xem xét các tương tác người dùng sau: tài bắt đầu từ ngày tab1 và hiện một số thay đổi mà đặt tình trạng quan điểm của tab1 ở tiểu bang khác hơn trạng thái mặc định của nó (và chúng tôi muốn đoạn để tiết kiệm trạng thái xem này thông qua tabswitches và thiết bị nghiêng). Người dùng sau đó chuyển đến Tab2. Người dùng sau đó nghiêng cô/thiết bị của anh ấy (vẫn ở Tab2). Người dùng sau đó hoán đổi sang Tab1 (theo hướng màn hình mới). Bây giờ, vấn đề là: Khi người dùng ban đầu hoán đổi từ Tab1 sang Tab2, đoạn được tách ra và do đó chế độ xem của nó bị loại bỏ (mặc dù cá thể mảnh vẫn còn sống). Khi người dùng sau đó nghiêng thiết bị, hoạt động - và do đó cả FragmentA và FragmentB liên kết với nó - đều bị hủy. Vì FragmentA tại thời điểm này không còn có chế độ xem nữa (hãy nhớ: nó đã được tách ra), chúng tôi không thể lưu trạng thái của các phần tử xem của nó (ví dụ: các nút được bật/tắt) trong khi gọi tới FragmentA.onSaveInstanceState(Bundle savedInstanceState)
. Làm cách nào để bạn khôi phục trạng thái xem phân đoạn trong tình huống như thế này? Là giải pháp khả thi duy nhất để lưu các cờ trạng thái khác nhau của mỗi phần tử xem như SharedPreferences? Điều này có vẻ quá phức tạp cho một "công việc hàng ngày" như vậy.
Tôi đã ở trên SO và nhiều bài đăng trên blog khác nhau nhưng chưa tìm được giải pháp cho vấn đề cụ thể này.
Rất cám ơn - lời giải thích tốt. Tuy nhiên, mọi thứ vẫn chưa hoàn toàn rõ ràng với tôi. Tôi đã vượt qua câu trả lời mà bạn đang đề cập, nhưng tôi không hiểu cách sử dụng nó. Những gì được coi là một "CustomView"? Trạng thái xem đoạn của tôi bao gồm chỉ được xây dựng trong Chế độ xem (như EditTexts, Nút v.v.). Do đó tôi đã không mở rộng bất kỳ lớp Xem nào - tôi vừa xây dựng khung nhìn phân mảnh trong tệp bố cục xml. Làm thế nào tôi có thể kết nối mã mẫu được cung cấp trong câu trả lời cho bố cục của tôi không sử dụng bất kỳ chế độ xem do người dùng xác định nào (giả sử một CustomView là cho android điều khiển do người dùng định nghĩa là ASP .NET)? –
@jvmk Để sử dụng View.onSaveInstanceState(), bạn sẽ cần phải phân lớp một View và ghi đè lên phương thức đó. XML bố cục của bạn sau đó cần tham chiếu đến các chế độ xem mới này, thay vì EditText/Button. – antonyt
Woah, thật điên rồ. Tôi nghĩ khôi phục trạng thái xem được xây dựng trong Chế độ xem sẽ là một nhiệm vụ tái xuất hiện thường xuyên đủ để điều này được hỗ trợ như một tính năng tiêu chuẩn. Giả sử tôi nên viết một thư viện để sử dụng sau này. Cảm ơn vì đã giúp tôi ở đây. Điều này đã làm tôi khó chịu trong 2 tuần nay, heh. –