반응형
네비게이션 드로어를 사용하다 보면 아래와 같은 방법으로 Fragment replace를 많이 사용하고는 한다. 하지만, 아래와 같은 방법으로 사용했을때 가장 큰 문제점은 Fragment들이 replace될 때마다 onCreate하여 화면을 다시 그린다는 것이다.
Fragment 라이프사이클도 찾아보고 방법을 생각해 보았지만 화면을 다시 그리는 상황을 막아야할 때 이 문제를 어떻게 해결해야할지 막막했다.
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment, fragmentTag).commitAllowingStateLoss();
조금은 꼼수 같지만 아래와 같은 방법으로 show/hide하여 replace가 아닌 방법으로 사용하도록 만들어 보았다.
public void changeFragment(int fNum) {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
switch (fNum) {
case 0:
if (fragmentManager.findFragmentByTag("a") != null) {
//if the fragment exists, show it.
fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("a")).commit();
} else {
//if the fragment does not exist, add it to fragment manager.
fragmentManager.beginTransaction().add(R.id.fragment_container, new FragmentA(), "a").commit();
}
if (fragmentManager.findFragmentByTag("b") != null) {
//if the other fragment is visible, hide it.
fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("b")).commit();
}
break;
case 1:
if (fragmentManager.findFragmentByTag("b") != null) {
//if the fragment exists, show it.
fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("b")).commit();
} else {
//if the fragment does not exist, add it to fragment manager.
fragmentManager.beginTransaction().add(R.id.fragment_container, new FragmentB(), "b").commit();
}
if (fragmentManager.findFragmentByTag("a") != null) {
//if the other fragment is visible, hide it.
fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("a")).commit();
}
break;
}
}
* 혹시나 정석정인 방법이 있다고 한다면 누가 가르쳐 주시면 감사하겠습니다.
반응형
'Android' 카테고리의 다른 글
[Android] 안드로이드 KeyEvent 2번 실행 방지 (0) | 2016.12.02 |
---|---|
[Android] 안드로으드 툴바 메뉴 삭제하기 (0) | 2016.12.01 |
[Android] TabLayout 탭 레이아웃 만들기!!(유튜브 탭 레이아웃) (0) | 2016.11.29 |
[Android] EditText 엔터키 이벤트 (0) | 2016.11.24 |
[Android] Fragment 별로 메뉴 구성 다르게 하기 (0) | 2016.11.23 |