2013-06-14 40 views

Trả lời

92

Hãy thử điều này

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
+1

Tôi có cùng một vấn đề và điều này không làm việc cho tôi! –

+5

Vui lòng giải thích vì đây là một trong những giải pháp tốt nhất. Thay vào đó, bạn có thể phải gọi popBackStackImmediate nếu bạn đang thêm nội dung mới vào hậu trường ngay sau khi xóa. – marsbear

+13

Điều này sẽ chỉ bật trạng thái hàng đầu, không xóa hậu trường nếu có nhiều hơn một. – Tapirboy

14

một cách là thẻ sự backstack và khi bạn muốn xóa nó

mFragmentManager.popBackStack("myfancyname", FragmentManager.POP_BACK_STACK_INCLUSIVE); 

nơi "myfancyname" nên phù hợp với chuỗi bạn sử dụng với addToBackStack. Ví dụ.

Fragment fancyFragment = new FancyFragment();  
fragmentTransaction.replace(R.id.content_container, fancyFragment, "myfragmentag"); 
fragmentTransaction.addToBackStack("myfancyname"); 

tên 's backstack và tên thẻ của mảnh có thể giống nhau nhưng không có ép về vấn đề này

Từ các tài liệu

Nếu được đặt, và tên hoặc ID của một mục nhập ngăn xếp lại đã được cung cấp, thì tất cả các mục phù hợp sẽ được sử dụng cho đến khi một mục không phù hợp với số hoặc dưới cùng của ngăn xếp. Nếu không, tất cả các mục nhập tối đa nhưng không bao gồm mục nhập đó sẽ bị xóa.

nếu bạn không muốn sử dụng tên cho backstack của bạn, bạn có thể vượt qua sử dụng một tham số đầu tiên

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
+0

Bạn đặt tên cho backstack như thế nào? –

+1

Gokhan, tên không phải là tên của backstack, đó là tên thẻ của Fragment. Ví dụ của ông, Fragment mà ông popping sẽ được thêm vào như thế này: 'mFragmentManager.beginTransaction(). Thêm (mFragment," myfancyname ");' –

6

Đây là hơi muộn nhưng tôi chỉ đã có vấn đề này bản thân mình. Bạn có thể làm:

FragmentManager manager = getFragmentManager(); 
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0); 
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Khá tự giải thích; bạn chỉ nhận được mục nhập đầu tiên, lấy id của nó và sau đó bật mọi thứ lên và bao gồm mục nhập có id đó.

67

trả lời ở trên là gần như chính xác, nhưng bạn cần một người bảo vệ xung quanh mảnh trở lại danh sách vì nó thể để trống:

private void clearBackStack() { 
    FragmentManager manager = getSupportFragmentManager(); 
    if (manager.getBackStackEntryCount() > 0) { 
     FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0); 
     manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
} 
15
while (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
    getSupportFragmentManager().popBackStackImmediate(); 
} 
+0

Đây phải là câu trả lời được chấp nhận nếu bạn xây dựng thêm. Xóa toàn bộ backstack là những gì chúng tôi muốn – HaydenKai

+2

Nhưng nó cho thấy cái cuối cùng. Thông thường, sau đó bạn chỉ cần thêm mảnh mới để backstack. –

+0

Một lưu ý ở đây là popping backstack trong một vòng lặp như thế này sẽ gọi các sự kiện vòng đời trong tất cả các mảnh nó xuất hiện (các phương thức tạo cũng như các phương thức tắt), có thể khiến bạn bị các tác dụng phụ không mong muốn. –

0

Lựa chọn tốt nhất mà tôi từng thấy là ở đây.

  int count = getSupportFragmentManager().getBackStackEntryCount(); 
      if (count > 0) { 
       getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      } 
Các vấn đề liên quan