마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Fragment replace할때 data 보존하려면..

0 추천

안녕하세요

현재 Fragment를 이용해서 탭화면을 구성하였는데

탭버튼을 눌러서 Fragment 이동시 화면이나 Data를 유지하고 싶습니다..

(예를들어 A Fragment가 Recyclerview로 이루워졌는데 list를 추가하거나 스크롤이 가운데 있을때 B버튼을 눌러 B Fragment로 이동했다가 A Fragment로 다시 돌아왔을시 그 화면이나 데이터를 유지하고 싶습니다.. 현재는 새로 다시 화면이 뿌려져서 add한 데이터도 사라집니다.. sqlite로 insert해서 다시 뿌려주는방식이 가능하긴 하지만 기획상 db저장은 이때 해주지 않을계획이라)

그래서 BackStack을 이용해야 할 거 같은데 어떤식으로 접근해야 할지 모르겠습니다..

일단 현재 코드는 이런식으로 이루어져있습니다(대부분 이름변경하고 했지만)

case A탭 눌렀을때 :
replaceA();
break;

case B탭 눌렀을때 :
replaceB();
break;

case C탭 눌렀을때 :
replaceC();
break;

private void replaceA()
{
   A a = new A();
   Fragment fragmentManager = getFragmentManager();
   FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
   fragmentTransaction.replace(R.id.교체할 영역, a);
   fragmentTransaction.commit();
}
private void replaceB()
{
   B b = new B();
   Fragment fragmentManager = getFragmentManager();
   FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
   fragmentTransaction.replace(R.id.교체할 영역, b);
   fragmentTransaction.commit();
}

private void replaceC()
{
   C c = new C();
   Fragment fragmentManager = getFragmentManager();
   FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
   fragmentTransaction.replace(R.id.교체할 영역, c);
   fragmentTransaction.commit();
}

BackStack을 넣기위해 replace와 commit 사이에 .addToBackStack을 넣어보기도 했는데

백버튼으로 해서 fragmentManager.popBackStack();까진 되는데 탭버튼으로 Fragment 교체할때는

생각한대로 되질 않습니다..

.addToBackStack("A"), ("B"), ("C") 이런식으로 tag를 남겨서 버튼을 눌렀을때 불러와야할것 같은데

어떤식으로 코딩해야할지 감이 안옵니다..

Stack 무한대로 쌓이는걸 방지하기 위해서 getBackStackEntryCount로 갯수확인하면서 3개만 유지해야할

것같은데 이부분도 감이 잘 안오고.. 

어떤식으로 접근해야하는지 힌트라도 주시면 감사하겠습니다.. 

익명사용자 님이 2016년 8월 8일 질문

2개의 답변

0 추천
 
채택된 답변
Fragment에서 데이터를 저장하는 경우 아래와 같이 사용하시면 됩니다.

@Override
public void onCreate(Bundle savedInstanceState) {
  if(savedInstanceState != null) {
            tabIndex = savedInstanceState.getInt("tabIndex");
        }
}
  
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  savedInstanceState.putInt("tabIndex", tabIndex);  
}

그리고, FragmentStatePagerAdapter 를 사용하시면 Fragment 개수와 상관없이 사용하실 수 있습니다.

public class StoragePagerAdapter extends FragmentStatePagerAdapter implements ViewPager.OnPageChangeListener {

}
mcsong (44,040 포인트) 님이 2016년 8월 8일 답변
0 추천
인스타그램 같은 탭방식을 원하시는것 같네요. 저도 계속 찾아보고 고민하다가 한가지 방법을 찾은 것을 말씀드리자면

각 탭의 갯수에 해당하는 Activity를 만듭니다. 그래서 탭간 이동은 Activity를 이동하는 것으로합니다. 이동하는 Flag중에

reorder라는 없으면 새로만들고 Stack에 존재하면 가장 상위 스택으로 올려주는 Flag가 있는데 이를 사용하면됩니다.

그리고 모든 View들을 Fragment로 구현하여 replace로 구현하시면됩니다.

이때 replace로 구현하게될 경우 말씀하신대로 recyclerview나 listview에 경우 스크롤의 위치가 저장되지 않는 문제가 있는데 이는 onCreateView에서 Adapter와 RecyclerView를 만들고있기 때문입니다. 현재 레이아웃에 다른 fragment가 replace되면 이전 fragment는 onDestroyView를 호출하여 View들을 파괴하게 됩니다. 이후에 다시 백스택으로 돌아오면 onCreateView를 다시 부르게 되구요.

즉 onCreateView에서는 View생성을 하시면 되며 onCreate같이 Fragment생성시 한번만 호출되는 함수에서 데이터를 생성하시면 됩니다. 여기서 아답터와 list를 만들게 되면 기존 데이터들도 보존되고 스크롤값들도 보존할 수 있습니다.
코코고고고고고고고아 (160 포인트) 님이 2016년 8월 9일 답변
...