2013-07-06 30 views
12

Tôi đang gặp rất nhiều khó khăn với những mảnh Android ... Giả sử trở lại ngăn xếp của tôi trông như thế nàyThay thế đoạn đầu trên stack lại

[C] 
[B] 
[A] 
--- 

Nhấn nút quay lại sẽ bật Fragment C tắt, và để lại Fragment B trên cùng của ngăn xếp. Bây giờ, làm cách nào để trao đổi Fragment C cho Fragment D trong khi vẫn duy trì ngăn xếp lại? Lưu ý, không thể nhìn thấy Fragment B trong quá trình hoạt động.

[C] <- [D]    [D] 
[B]   -----> [B] 
[A]      [A] 
---      --- 

Bằng cách này, nhấn vào nút quay lại sẽ bật Fragment D tắt, và để lại Fragment B trên đầu trang. Fragment C bị xóa hoàn toàn khỏi ngăn xếp.

tôi thêm mỗi mảnh vỡ để ngăn xếp như vậy

FragmentTransaction ft = manager.beginTransaction(); 
ft.replace(id, instance, getTag(instance)); 
ft.addToBackStack(getTag(instance)); 
ft.commit(); 

Tôi nghĩ điều này có thể đạt được bằng cách thực hiện các cuộc gọi tương tự mà không addToBackStack, nhưng nó chỉ làm Fragment DFragment B chồng chéo.

+0

mà không có 'addToBackStack', giao dịch của bạn vẫn mặc dù bật ngăn xếp, dẫn đến đoạn D của bạn được hiển thị với B – njzk2

Trả lời

4

Bạn có cố gắng bật stack trở lại trước khi bạn thêm đoạn D:

FragmentManager fragmentManager = getFragmentManager(); 
fragmentManager.popBackStack(); // or popBackStackImmediate(); 
ft.addToBackStack(<fragmentD>); 
+1

Xin lỗi, tôi quên đề cập đến' Fragment B' không thể được nhìn thấy trong quá trình hoạt động. Tuy nhiên, cảm ơn cho đầu vào của bạn :) – ains

+1

loại công trình, nhưng backstack được thông báo, đoạn B là một thời gian ngắn có thể nhìn thấy. không lý tưởng. – njzk2

0

Các fragmentTransaction.replace phải thay thế tất cả các mảnh vỡ trong FragmentManager, và sau đó thêm một hình mới. Theo Google:

Đây thực chất là giống như kêu gọi loại bỏ (Fragment) cho tất cả mảnh hiện thêm rằng đã được thêm vào với containerViewId cùng và sau đó thêm (int, Fragment, String) với cùng đối số được đưa ra ở đây.

Nhưng như chúng ta thấy, nó không phải lúc nào cũng hoạt động tốt.

(câu hỏi khác hữu ích về điều đó: FragmentTransaction replace not working)

tôi sử dụng đoạn mã sau (với sự giúp đỡ của fragmentManager.getFragments()):

int top = getSupportFragmentManager().getFragments().size()-1; 
while (top > 0 && getSupportFragmentManager().getFragments().get(top) == null) { 
    top--; 
} 
getSupportFragmentManager().beginTransaction() 
       .remove(getSupportFragmentManager().getFragments().get(top)) 
       .add(R.id.fragment_container, newfrag).commit(); 

(Tôi biết tôi không sử dụng backstack, nhưng tôi 'một chút nhầm lẫn với điều đó.)

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