2013-04-07 31 views
32
FragmantClass rSum = new FragmantClass(); 
getSupportFragmentManager().beginTransaction().remove(rSum).commit();  

Tôi đang cố xóa đoạn này, khi tôi tải chuyển đoạn khác. Đoạn trên không bị xóa. Đây là phương pháp tôi đang gọi để chuyển đổi các đoạn.Xóa các đoạn khỏi hoạt động

public void switchContent(Fragment fragment) { 
    FragmantClass rSum = new FragmantClass(); 
    getSupportFragmentManager().beginTransaction().remove(rSum).commit(); 
    mContent = fragment; 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, fragment) 
     .commit(); 
    getSlidingMenu().showContent(); 
} 

Trả lời

39
getSupportFragmentManager().beginTransaction(). 
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit(); 

Hãy thử điều này, cần làm việc.

public void switchContent(Fragment fragment) { 
    getSupportFragmentManager().beginTransaction(). 
    remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit(); 
    mContent = fragment; 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, fragment) 
     .commit(); 
    getSlidingMenu().showContent(); 
} 
7

Đây là giải pháp rất đơn giản cho SupportFragmentManager. FragmentManager không phải là khá thuận tiện, nhưng vẫn hiệu quả:

List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
// You might have to access all the fragments by their tag, 
// in which case just follow the line below to remove the fragment 
if (fragmentList == null) { 
    // code that handles no existing fragments 
} 

for (Fragment frag : fragmentList) 
{ 
    // To save any of the fragments, add this check 
    // a tag can be added as a third parameter to the fragment when you commit it 
    if (frag.getTag().equals("<tag-name")) { 
     continue; 
    } 

    getSupportFragmentManager().beginTransaction().remove(frag).commit(); 
} 

hoặc, nếu bạn buộc phải sử dụng nó (nhưng không khuyến khích):

.commitAllowingStateLoss(); 

Nếu bạn đang loại bỏ tất cả các mảnh vỡ từ chế độ xem nhiều lần, bạn có thể xem xét kiểm tra xem phân đoạn hiện tại có là null hay isDetached() hoặc isRemoving() hoặc bạn có thể nhận được NullPointerExceptions.

Update 6-9-15: Các tài liệu cho getSupportFragmentManger().getFragments() là rõ ràng hidden bây giờ, nhưng vẫn hoạt động tốt trong mã của tôi. Dưới đây là ảnh chụp màn hình của tài liệu:

enter image description here

Update 8-3-15: Nếu bạn không sử dụng các thư viện hỗ trợ cho các mảnh vỡ, đáng tiếc là không có getFragments() sẵn, nhưng vẫn có một vài , các tùy chọn bất tiện hơn.

  1. Cho mỗi fragment một tag hoặc id khi tạo, và lặp qua chúng để xử lý mỗi fragment như mong muốn.
  2. Tạo người nghe sử dụng onAttachListener để mỗi lần fragment mới được gắn vào activity, bạn có thể lưu trữ fragment đó, sau đó lặp qua cấu trúc dữ liệu đó để xử lý mỗi fragment như mong muốn.

Khi không sử dụng getSupportFragmentManager(), để xử lý giao dịch bạn cần sử dụng getFragmentManager() thay thế.

+0

Bạn có thể cung cấp liên kết đến phương thức 'getFragments()' không? –

+1

@IvanBlack, dường như không có liên kết nào khả dụng. Tôi tự tin rằng tài liệu đã có sẵn cho nó khi tôi viết bài này, nhưng API cho thấy nó đã ẩn, nó vẫn hoạt động. – craned

10

Trong trường hợp cá nhân của tôi, tôi thêm và loại bỏ đoạn theo cách này:

if(getSupportFragmentManager().findFragmentById(R.id.container) != null) { 
     getSupportFragmentManager() 
       .beginTransaction(). 
       remove(getSupportFragmentManager().findFragmentById(R.id.container)).commit(); 
    } 
    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.container, fragment) 
      .commit(); 

Luôn luôn là tốt xác minh nếu container của bạn có một đoạn hoặc sẽ có một ngoại lệ vô

+1

cảm ơn người đàn ông! hoạt động hoàn hảo. –

-1

More đơn giản, bạn có thể thay thế nội dung chính với một đoạn trống, để hoạt động chính chỉ được xem.

getFragmentManager() 
.beginTransaction() 
.replace(main_content,new Fragment()) 
.commit(); 
Các vấn đề liên quan