2014-06-19 21 views

Trả lời

1

Bạn có thể làm điều đó theo cách tương tự - chỉ cần sử dụng FragmentManager thu được bằng cách sử dụng Fragment dụ của getChildFragmentManager() thay vì ActivityFragmentManager. Tất nhiên, điều này giả định bạn đang sử dụng một phiên bản biên dịch lại của thư viện hỗ trợ với getFragments() không bị ẩn hoặc đang sử dụng sự phản chiếu để gọi phương thức đó.

+0

cách tương tự như những gì? Hơn nữa, tôi đang tìm một số phương pháp mà sẽ luôn luôn làm việc, nó không phải cho một ứng dụng nhưng đối với một thư viện mà nên làm việc cho tất cả các ứng dụng. – Snicolas

+0

Giống như câu trả lời bạn đã liên kết đến (sử dụng getFragments()). Tôi không tin có cách nào khác để làm như vậy. – kcoppock

+0

Dường như getFragments đã công khai trên trình quản lý phân đoạn hỗ trợ, ngay cả khi javadoc không nói như vậy. Và có, sử dụng sự phản chiếu là bắt buộc đối với người quản lý phân đoạn gốc. – Snicolas

0

Các giải pháp sau đây không phải là hoàn hảo nhưng nó hoạt động ở một mức độ nào:

  • Nếu Android SDK là 17+, sau đó nó hoạt động tốt
  • dưới SDK 17 nó hoạt động cho mảnh ở mức root (thêm trực tiếp đến hoạt động) và cũng hoạt động tốt cho các đoạn của cấp 1 (được thêm vào một đoạn ở cấp cơ sở).
  • cho các phân đoạn cấp> = 2, sau đó nó sẽ luôn trả về một đoạn gốc. Điều đó có nghĩa là không thể trả về cha mẹ thực sự của một đoạn có cấp là> = 2, nó sẽ luôn trả về tổ tiên của nó ở cấp cơ sở.
  • Và, thật không may, điều đó có nghĩa là bạn phải có quyền truy cập vào lớp hoạt động, vì vậy giải pháp này không thực sự chung chung.

Đây là giải pháp. Lớp MyActivity được đưa ra dưới đây.

public static Fragment getParentFragment(Fragment fragment) { 
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) 
     return fragment.getParentFragment(); 
    MyActivity activity = (MyActivity)fragment.getActivity(); 
    List<Fragment> fragmentList = activity.getActiveFragments(); 
    if(fragmentList.contains(fragment)) { 
     return null; 
    } 
    for(Fragment fragmentLevel1 : fragmentList) { 
     if(fragmentLevel1.getFragmentManager() == fragment.getFragmentManager()) { 
      return fragmentLevel1; 
     } 
    } 
    //this is not supposed to happen, it might be better to throw an exception 
    return null; 
} 

đâu MyActivity dựa trên: Is there a way to get references for all currently active fragments in an Activity?

public class MyActivity { 
    List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>(); 

    @Override 
    public void onAttachFragment (Fragment fragment) { 
     fragList.add(new WeakReference(fragment)); 
    } 

    public List<Fragment> getActiveFragments() { 
     ArrayList<Fragment> ret = new ArrayList<Fragment>(); 
     for(WeakReference<Fragment> ref : fragList) { 
      Fragment f = ref.get(); 
      if(f != null) { 
       if(f.isVisible()) { 
        ret.add(f); 
       } 
      } 
     } 
     return ret; 
    } 
} 
Các vấn đề liên quan