2012-01-07 36 views
44

Activity layout pictureLàm cách nào để bật lại ngăn xếp cho Hoạt động với nhiều Phân đoạn?

Giả sử tôi có một Hoạt động, trong đó có hai FrameLayouts (chúng ta hãy gọi chúng FrameA và FrameB) mà lần lượt mỗi chứa một Fragment (chúng ta hãy gọi chúng FragmentA1 và FragmentB1 tương ứng). Bây giờ, tôi cam kết một loạt các giao dịch đoạn cá nhân sử dụng mã tương tự như sau ...

getFragmentManager() 
.beginTransaction() 
.replace(frameId, fragment) 
.addToBackStack(null) 
.commit(); 

... như vậy mà tôi thay thế FragmentA1 trong FrameA với FragmentA2, sau đó tôi thay FragmentB1 trong FrameB với FragmentB2, sau đó tôi thay thế FragmentA2 trong FrameA bằng FragmentA3, sau đó tôi thay thế FragmentB2 trong Frame2 bằng FragmentB3 và trạng thái cuối cùng trông giống như hình bên trên (nơi chỉ có FragmentA3 và FragmentB3 được hiển thị).

Nếu tôi hiểu chính xác cách ngăn xếp hoạt động trở lại, nhấn 'quay lại' sẽ xen kẽ các mảnh vỡ giữa FrameA và FrameB (phản ánh cách tôi thêm chúng).

Có ai biết liệu có thể bật giao dịch cuối cùng trên FrameA hoặc FrameB một cách chọn lọc không? (Ví dụ: nếu tôi ép 'Pop FrameA' sau đó FrameA sẽ được chuyển trở lại từ FragmentA3 để FragmentA2 và, thay vào đó, nếu tôi ép 'Pop FrameB' sau đó FrameB sẽ được chuyển trở lại từ FragmentB3 để FragmentB2)

bổ sung: Tôi biết tôi có thể nhận được Fragment được thêm lần cuối vào FrameLayout đã cho bằng cách sử dụng phương thức FragmentManager.findFragmentById(int framelayoutId), nhưng gọi FragmentTransaction.remove(fragment).commit() chỉ xóa Fragment khỏi Chế độ xem và không chuyển View trở lại Fragment được hiển thị trước đó.

+1

Nếu FragmentTransaction.remove "chỉ loại bỏ các Fragment từ Xem và không chuyển tiếp các chế độ xem", sau đó những gì đang hiển thị trong quan điểm? Nhưng tôi có thể thấy lý do tại sao điều này có thể gây nhầm lẫn nếu Mgr giữ một chồng các mảnh nhưng không biết cái nào được nhìn thấy đồng thời, tức là làm sao nó biết rằng A2 là "bên dưới" A3 khi B2 có thể nằm giữa chúng trên cây rơm? – gordonwd

+0

Nếu một khung nhìn (FrameLayout trong trường hợp của tôi) đã có nhiều Fragments được thêm vào nó bằng phương thức 'FragmentTransaction.add (int, Fragment)', sau đó gọi 'FragmentTransaction.remove (Fragment) .commit()' Tôi tin rằng sẽ rời khỏi FrameLayout hiển thị Fragment được thêm vào cuối cùng. Tuy nhiên, thêm Fragments vào View bằng cách sử dụng phương thức 'FragmentTransaction.replace (int, Fragment)' (như tôi đang làm, giả sử điều này tốt hơn cho bộ nhớ ?!) sẽ để lại FrameLayout con-less (tức là hiển thị dưới dạng View rỗng) ... –

+0

Để thêm vào nhận xét trước của tôi: Tôi có thể thấy rằng có một số phương pháp hữu ích như 'FragmentManager.getBackStackEntryAt (int index)', 'FragmentManager.popBackStack (Tên chuỗi, cờ int) ',' popBackStack (int id, int flags) ',' FragmentTransaction.addToBackStack (Tên chuỗi) 'và' FragmentTransaction.replace (int containerViewId, Fragment fragment, String tag) ', không chắc chắn làm thế nào để hồ bơi chúng lại với nhau để đạt được những gì tôi yêu cầu ... –

Trả lời

22

Về cơ bản, không, chỉ có một ngăn xếp lưng cho hoạt động.

Bạn sẽ chỉ cần triển khai các ngăn xếp riêng biệt của riêng bạn.

Kể từ Android 4.0 (và thư viện hỗ trợ liên quan) có các API nên thực hiện việc này tương đối dễ dàng - FragmentTransaction.detach(Fragment) cho phép bạn đặt một đoạn vào cùng trạng thái khi ở trong ngăn xếp sau và FragmentManager.saveFragmentInstanceState(Fragment) cho phép bạn tiếp tục và vứt bỏ hoàn toàn đối tượng Fragment. Không phải ngẫu nhiên, chúng được sử dụng để triển khai FragmentPagerAdapter của ViewPager và FragmentStatePagerAdapter, tương ứng, vì vậy bạn có thể xem mã này để làm ví dụ về cách sử dụng chúng.

+0

Cảm ơn bạn đã phản hồi Hackbod. Tôi phải tiến bộ với những gì tôi biết để thực hiện một giải pháp mà tôi đang ẩn Fragment A1 trước khi _adding_ (thay vì _replacing_) Đoạn A2 trên đầu trang, và sau đó _showing_ Fragment A1 một lần nữa khi Fragment A2 bị loại bỏ. Nó làm việc cho tôi nhưng chắc chắn sẽ đi với việc thực hiện trở lại của riêng tôi ngăn xếp như bạn mô tả trong các dự án trong tương lai hoặc nếu bất kỳ hành vi không mong muốn bề mặt trong hiện tại: - \ Cảm ơn một lần nữa. –

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