Programing

조각 관리자에서 오래된 조각 제거

crosscheck 2020. 12. 10. 18:51
반응형

조각 관리자에서 오래된 조각 제거


FragmentAndroid에서 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

반응형