2013. 7. 11.

[Android] Custom animated Framgnet 숨기기 동작 수정 / Solution for hiding custom animated fragment

은근히 많은 안드로이드 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번은 간단히
fragmentTransaction.setCustomAnimation(...)    <= 빠이염~


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;
  }
}


끝~

댓글 없음:

댓글 쓰기

[다자녀할인] 2자녀 이상 모든 공항 주차장 50% 할인받기 (둘 중 한명은 15세 이하)

다자녀 기준이 2명으로 완화되면서 자녀가 2명만 되어도 공영주차장 50%(지역에 따라 30%인 곳 도 있음) 할인이 가능하고, 전국의 공항주차장도 50% 할인이 가능하다. "다둥이카드" 나 "경기 I Plus 카드"...