태그 보관물: back-stack

back-stack

백 스택에서 최신 조각 가져 오기 fragManager =

백 스택에 추가 된 최신 조각 인스턴스를 얻으려면 어떻게해야합니까 (조각 태그 및 ID를 모르는 경우)?

FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();

/****After add , replace fragments 
  (some of the fragments are add to backstack , some are not)***/

//HERE, How can I get the latest added fragment from backstack ??



답변

API 레벨 14에서 도입 된 getName()메소드를 사용할 수 있습니다 FragmentManager.BackStackEntry.이 메소드는를 사용하여 백 스택에 Fragment를 추가 할 때 사용한 태그를 반환합니다 addTobackStack(tag).

int index = getActivity().getFragmentManager().getBackStackEntryCount() - 1
FragmentManager.BackStackEntry backEntry = getFragmentManager().getBackStackEntryAt(index);
String tag = backEntry.getName();
Fragment fragment = getFragmentManager().findFragmentByTag(tag);

다음과 같이 백 스택에 조각을 추가했는지 확인해야합니다.

fragmentTransaction.addToBackStack(tag);


답변

FragmentManager.findFragmentById(fragmentsContainerId) 

함수Fragment백 스택의 맨 위로 링크를 반환합니다 . 사용 예 :

    fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer);
            if(fr!=null){
                Log.e("fragment=", fr.getClass().getSimpleName());
            }
        }
    });


답변

나는 이러한 솔루션 중 많은 것을 개인적으로 시도했고 결국이 작동하는 솔루션으로 끝났습니다.

백 스택의 조각 수를 가져 오기 위해 아래에서 여러 번 사용할이 유틸리티 메서드를 추가합니다.

protected int getFragmentCount() {
    return getSupportFragmentManager().getBackStackEntryCount();
}

그런 다음 FragmentTransaction 메소드를 사용하여 프래그먼트를 추가 / 교체 할 때 프래그먼트에 고유 태그를 생성합니다 (예 : 스택의 프래그먼트 수 사용).

getSupportFragmentManager().beginTransaction().add(yourContainerId, yourFragment, Integer.toString(getFragmentCount()));

마지막으로이 방법을 사용하여 백 스택에서 조각을 찾을 수 있습니다.

private Fragment getFragmentAt(int index) {
    return getFragmentCount() > 0 ? getSupportFragmentManager().findFragmentByTag(Integer.toString(index)) : null;
}

따라서 다음을 호출하여 백 스택에서 최상위 조각을 쉽게 가져올 수 있습니다.

protected Fragment getCurrentFragment() {
    return getFragmentAt(getFragmentCount() - 1);
}

도움이 되었기를 바랍니다!


답변

이 도우미 메서드는 스택 상단에서 조각을 가져옵니다.

public Fragment getTopFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return getSupportFragmentManager().findFragmentByTag(fragmentTag);
}


답변

Kotlin

activity.supportFragmentManager.fragments.last()


답변

fragmentMananger에 조각 목록이 있습니다. 조각을 제거해도 목록 크기가 줄어들지는 않습니다 (조각 항목이 null로 변경됨). 따라서 유효한 솔루션은 다음과 같습니다.

public Fragment getTopFragment() {
 List<Fragment> fragentList = fragmentManager.getFragments();
 Fragment top = null;
  for (int i = fragentList.size() -1; i>=0 ; i--) {
   top = (Fragment) fragentList.get(i);
     if (top != null) {
       return top;
     }
   }
 return top;
}


답변

나는 항상 null을 받기 때문에 deepak goel이 제공하는 대답은 나를 위해 작동하지 않습니다 entry.getName().

내가하는 일은 다음과 같이 조각에 태그를 설정하는 것입니다.

ft.add(R.id.fragment_container, fragmentIn, FRAGMENT_TAG);

ft는 내 조각 트랜잭션이고 FRAGMENT_TAG태그입니다. 그런 다음이 코드를 사용하여 조각을 가져옵니다.

Fragment prev_fragment = fragmentManager.findFragmentByTag(FRAGMENT_TAG);