은근히 많은 안드로이드 SDK의 버그...
Fragment를 이용하여 화면을 구성할 때,
Fragment를 분명히 hide 시켰는데, hide되지 않는 경우가 있다..
위 Activity에 다음처럼 명령을 주면
  1. add - Fragment A
  2. add - Fragment B
  3. hide - Fragment A
기대하는 결과는
....
하지만 현실은
젠장... 왜 -_-;; 난 hide를 분명 했단 말이다!!
현재까지의 버전(젤리빈 4.2.2, Android support pack rev 13) 에서 이 문제를 해결하기 위해서는
    1. Fragment A 의 현란한 애니메이션을 삭제 -> 까이꺼 날려버려~
    2. Fragment B 에서 수동으로 attach / detach -> state까지 기억해야돼.. 귀찮아 ㅜㅜ
을 해야 한다.
1번은 간단히
2번은 간단히... (진정 간단하냐....?? 정말?)
public class FragmentB extends Fragment {
  @Override
  public void onHiddenChanged(boolean hidden) {
      super.onHiddenChanged(hidden);
      FragmentManager fm = getActivity().getSupportFragmentManager();
      if (hidden) {
        fm.beginTransaction().detach(this).commit();
      } else {
        fm.beginTransaction().attach(this).commit();
      }
  }
  @Override
  public void onSaveInstanceState(Bundle outState) {
    //내위치는 어디고,
    //선택은 뭐가 되었고,
    //사용자가 입력은 뭘 했구만..
    //오키~ 저장완료
    super.onSaveInstanceState(outState);
  }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...
    if (savedInstanceState != null) {
      //위치를 다시 옮기고
      //선택을 다시 해주고
      //입력한거 다시 입력해주고
      //짜잉나! -_-;;
    }
    ...
  }
}
간단하죠?
...
(돌 던지지 마세요... )
그래서 개선 했어요 ㅡㅡㅋ
public class FragmentC extends Fragment {
  private View mContentsView;
  @Override
  public void onHiddenChanged(boolean hidden) {
      super.onHiddenChanged(hidden);
      FragmentManager fm = getActivity().getSupportFragmentManager();
      if (hidden) {
        fm.beginTransaction().detach(this).commit();
      } else {
        fm.beginTransaction().attach(this).commit();
      }
  }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (mContentsView == null) {
      mContentsView = inflater.inflate(....);
    } else {
      ViewParent parent = mContentsView.getParent();
      if (parent != null && parent instanceof ViewGroup) {
        ((ViewGroup)parent).removeView(mContentsView);
    }
    return mContentsView;
  }
}
끝~



댓글 없음:
댓글 쓰기