조각 관리자에서 오래된 조각 제거
Fragment
Android에서 s 를 사용하는 방법을 배우려고합니다 . 나는 fragment
새로운 fragment
것이 안드로이드에서 호출 될 때 오래된 것을 제거하려고합니다 .
기존 Fragment의 참조를 찾고 아래 코드를 사용하여 해당 조각을 제거해야합니다. 하나의 태그를 사용하여 조각을 추가 / 커밋해야합니다. "TAG_FRAGMENT".
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
그게 다입니다.
조각을 다른 조각으로 바꾸려면 먼저 동적으로 추가해야합니다. XML로 하드 코딩 된 조각은 대체 할 수 없습니다.
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
이 게시물을 참조하십시오 : 활동 그룹 내에서 조각을 다른 조각으로 교체
Refer1 : 프로그래밍 방식으로 조각 바꾸기
나는 오래된 조각을 제거하는 것과 같은 문제가 있었다. 조각이 포함 된 레이아웃을 삭제했습니다.
LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...
이것이 누수를 일으키는 지 모르겠지만 저에게 효과적입니다.
아마도 당신은 참조를 유지하는 오래된 조각을 인스턴스화 할 것입니다. 흥미로운 기사 Android의 메모리 누수 — 식별, 처리 및 방지
addToBackStack을 사용하는 경우 가비지 콜렉터가 인스턴스를 지우지 않도록 인스턴스 조각에 대한 참조를 유지합니다. 인스턴스는 조각 관리자의 조각 목록에 남아 있습니다. 당신은 목록을 볼 수 있습니다
ArrayList<Fragment> fragmentList = fragmentManager.getFragments();
다음 코드는 최선의 해결책은 아니지만 (메모리 누수를 피하기 위해 이전 조각 인스턴스를 제거하지 않기 때문에) fragmentManger 조각 목록에서 이전 조각을 제거합니다.
int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);
FragmentManager가 인덱스 ArrayList와 함께 작동하여 조각을 가져 오기 때문에 arrayList의 항목을 제거 할 수 없습니다.
나는 보통 fragmentManager 작업에이 코드를 사용합니다.
public void replaceFragment(Fragment fragment, Bundle bundle) {
if (bundle != null)
fragment.setArguments(bundle);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment oldFragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());
//if oldFragment already exits in fragmentManager use it
if (oldFragment != null) {
fragment = oldFragment;
}
fragmentTransaction.replace(R.id.frame_content_main, fragment, fragment.getClass().getName());
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragmentTransaction.commit();
}
나는 같은 문제가 있었다. 나는 간단한 해결책을 생각 해냈다. 조각 .replace
대신 조각 을 사용하십시오 .add
. 조각을 추가하는 것과 동일한 작업을 수행하는 조각을 교체 한 다음 수동으로 제거합니다.
getFragmentManager().beginTransaction().replace(fragment).commit();
대신에
getFragmentManager().beginTransaction().add(fragment).commit();
참고 URL : https://stackoverflow.com/questions/22474584/remove-old-fragment-from-fragment-manager
'Programing' 카테고리의 다른 글
복합 기본 키가 여전히 존재하는 이유는 무엇입니까? (0) | 2020.12.10 |
---|---|
$ _GET이 있는지 확인하는 방법은 무엇입니까? (0) | 2020.12.10 |
Swift를 사용하여 하나의 ViewController에서 강제 가로 모드 (0) | 2020.12.10 |
IPython 노트북 셀 다중 출력 (0) | 2020.12.10 |
Django Admin : 하나의 모델 필드에만 사용자 정의 위젯 사용 (0) | 2020.12.10 |