2014-06-19 1 views

답변

1

당신은 같은 방법으로 그것을 할 수 관련이있다 - 바로 사용 FragmentManager 사용하여 얻은 Fragment 인스턴스의 대신 ActivityFragmentManagergetChildFragmentManager(). 물론 이것은 사용자가 getFragments()이 숨겨져 있지 않은 지원 라이브러리의 재 컴파일 된 버전을 사용 중이거나 리플렉션을 사용하여 해당 메소드를 호출한다고 가정합니다.

+0

같은 방법 :

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; } 

MyActivity를 기반으로 어디? 또한, 나는 항상 작동하는 몇 가지 방법을 찾고 있는데, 그것은 애플 리케이션을위한 것이 아니라 모든 애플 리케이션을 위해 작동해야하는 라이브러리를위한 것이다. – Snicolas

+0

(getFragments()를 사용하여) 연결된 응답과 동일합니다. 나는 그렇게 할 수있는 다른 방법이 있다고 생각하지 않습니다. – kcoppock

+0

javadoc이 그렇게 말하지 않더라도 getFragments가 지원 조각 관리자에 공개 된 것처럼 보입니다. 네, 리플렉션을 사용하는 것은 네이티브 프래그먼트 매니저에게 필수입니다. – Snicolas

0

다음 솔루션은 완벽하지 않습니다하지만 어느 정도 작동합니다

  • 안드로이드 SDK는 17 세 이상이면 잘 작동
  • 이 SDK는 루트 레벨에 조각 작동 (17) 아래
  • (추가 직접 활동으로), 레벨 1의 단편 (루트 레벨의 단편에 추가됨)에도 잘 작동합니다.
  • 레벨의 조각에 대해서는 루트 수준의 단편을 항상 반환합니다. 즉, 레벨이 2 이상인 프래그먼트의 실제 상위를 반환 할 수 없다는 것을 의미합니다. 루트 수준에서 항상 상위 항목을 반환합니다.
  • 그리고 안타깝게도 액티비티 클래스에 대한 액세스 권한이 있어야한다는 의미이므로이 솔루션은 실제로 일반적이지 않습니다.

여기 해결책이 있습니다. MyActivity 클래스는 아래와 같습니다. 내용과 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; 
    } 
} 
관련 문제