백 스택에 추가 된 최신 조각 인스턴스를 얻으려면 어떻게해야합니까 (조각 태그 및 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);